﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar.Rendering;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.Util;
using Emgu.CV.UI;
using DevComponents.DotNetBar;
using System.IO.Ports;
using Emgu.CV.Structure;
using System.Threading;
using Newtonsoft.Json;
using System.Diagnostics;
using System.IO;
using BKBIS;
using TIS.Imaging;
using TIS.Imaging.VCDHelpers;
//using testContext;

namespace Thesis_NCDat
{
    public partial class BKBIS : DevComponents.DotNetBar.Office2007RibbonForm
    {
        //Setup property camera
        private VCDSimpleProperty VCDProp;

        //private testDataContext context = new testDataContext();
        //private blister_Interface DatabaseManage = new blister_Interface();
        private Int32 inspection_count = 0;

        /*
      * Set up Uart params
      * using SelCom is a variable that check conditions to open port
      * it only receives a valid value from NewConnection form.
      */
        public static string SelCom = "";
        public static int Baudrate;
        public static int Databits;
        public static Parity Parity;
        public static StopBits Stopbits;

       

        private string chuoi;
        private int sending_flag = 0;
        private Capture cap;
        private Image<Bgr, Byte> image;
        private Image<Bgr, Byte> ImgloadFile;
        private string[] buffer = new string[10] { "", "", "", "", "", "", "", "", "", "" };
        private string[] ketqua = new string[6] { "", "", "", "", "", "" };
        private int[] type_error_sum = new int[7] { 0, 0, 0, 0, 0, 0, 0 };
        private int[] blister_error = new int[7] { 0, 0, 0, 0, 0, 0, 0 };
        private int[] blister_error_sum = new int[7] { 0, 0, 0, 0, 0, 0, 0 };
        private string Gui;
        private string Buf;
        private Int32 B;

        public BKBIS()
        {
            InitializeComponent();
            Com.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived);
            Control.CheckForIllegalCrossThreadCalls = false;
            styleManager1.ManagerStyle = eStyle.Office2007Blue;
            RibbonPredefinedColorSchemes.ChangeOffice2007ColorTable(eOffice2007ColorScheme.Blue);
            //PlusCountWhenReset(context);
            btn_GetImage.Enabled = false;
            btn_Inspection.Enabled = false;
            btn_ViewBinaryImage.Enabled = true;
            btn_start_live.Enabled = true;
            btn_stop.Enabled = true;
            btn_simulation.Enabled = true;
            LiveMode_radio.Checked = true;

            //icImagingControl1.LiveDisplayDefault = false;
            //icImagingControl1.LiveDisplayZoomFactor = 0.4f;


        }

        /************************
         * phan xu li anh
        ************************/
        private Image<Hsv, Byte> _hsvImage, _hsvImage1, _hsvImage2, _hsvImage3, _hsvImageROI, _hsvImageROI1;
        private Image<Ycc, Byte> _yccImage, _yccImage1, _yccImage2, _yccImageROI, _yccImageROI1;
        private Image<Bgr, Byte> _bgrImage, _bgrImage2, _bgrImageROI, _bgrImageROI1, _bgrImage1;
        private Image<Gray, Byte> _grayImage1, _grayImage2, _grayImage3, h, s, v, _binaryImage;
        private Capture _capture;
        private System.Drawing.Graphics formGraphics;
        private Rectangle rect, rectROI;
        private Pen drawPen;
        private Image GigcamImage;

        private bool disablelight = true,
            erodeimage = false,
            dilateimage = false,
            Mouse_is_down = false,
            datareceive = false,
            true_shape = false,
            Redraw_Contour_Pack = true,
            is_round = false,
            is_square = false,
            is_hsv = true,
            is_ycc = false,
            shape_round = true,
            shape_ellipse = false,
            shape_square = false,
            shape_capsule,
            true_size,
            viewbinary = false,
            viewbin = false,
            thresholdcircle = false,
            showerror = false,
            lowres = true,
            highres = false,
            autosave = false,
            pause = true,
            test1 = false,
            //is_twoColor = false,
            colorinrange = false;

        private int average_radius,
            rect_initialX,  // tọa độ X của hình chữ nhật khi vẽ đường bao cho viên thuốc ( tọa độ so với imagebox1)
            rect_initialY,
            rect_width,
            rect_height,
            tempx,
            tempy,
            number_of_row,
            number_of_column,
            ratio_resize,
            detect,
            number_of_tablets,
            num,
            area,
            area_average,
            error = 0,
            frame_width = 1280,
            frame_height = 960,
            index,
            true_area;

        private Rectangle rect10;
        private int[] average = new int[3];
        private string _pathImage = "", shape, result, path_item, check_half = "1st";   // pathIamge: đường dẫn ảnh training, path_item: đường dẫn ảnh lấy lên làm sample để inspection (trong tab config)
        private string[] filesname;
        private Contour<Point> _contours;
        private CircleF[] _circles;
        private OpenFileDialog _diagOpenFile;
        private BlisterFeatures _newdata;
        private MCvFont font1;
        private Filter FilterImage = new Filter();
        private LoadImage newload = new LoadImage();
        private FindError ErrorAndResult = new FindError();
        private Train newtrain = new Train();
        private ImageProcessing Process = new ImageProcessing();
        private Rectangle[] newtoado;
        private HashSet<string> list_item = new HashSet<string>();
        BlisterFeatures data = new BlisterFeatures();

        
                                                

        /****************************************************************************/

        private delegate void DlAddData(
            string column1, string column2, string column3, string column4, string column5, string column6,
            string column7, string column8);

        private void Add_Data(string column1, string column2, string column3, string column4, string column5,
            string column6, string column7, string column8)
        {
            if (DtgDatabase.InvokeRequired)
            {
                DlAddData sd = new DlAddData(Add_Data);
                DtgDatabase.Invoke(sd,
                    new object[] { column1, column2, column3, column4, column5, column6, column7, column8 });
            }
            else
            {
                DtgDatabase.Rows.Add(column1, column2, column3, column4, column5, column6, column7, column8);

            }
        }


        /********************************************************************************/

        //private void btn_viewdata_Click(object sender, EventArgs e)
        //{
        //    //update database table
        //    DtgDatabase.Rows.Clear();
        //    foreach (blister ids in DatabaseManage.GetAllData(context))
        //    {
        //        Add_Data(ids.COUNT.ToString(), ids.TIME.ToString(), ids.BLIS1.ToString(), ids.BLIS2.ToString(),
        //            ids.BLIS3.ToString(), ids.BLIS4.ToString(), ids.BLIS5.ToString(), ids.BLIS6.ToString());
        //    }
        //}

        //public void PlusCountWhenReset(testDataContext mydb)
        //{
        //    var query = from it in mydb.blister
        //        where it.COUNT != 0
        //        select it;
        //    inspection_count = query.Count();
        //}

        //public class blister_Interface
        //{
        //    /**/
        //    public TimeSpan Timecall = new TimeSpan();
        //    /************************************************************************/
        //    /* return query that search all element in database                     */
        //    /************************************************************************/

        //    public IEnumerable<blister> GetAllData(testDataContext mydb)
        //    {
        //        var query = from it in mydb.blister
        //            orderby it.COUNT
        //            select it;
        //        return query;
        //    }


        //    /************************************************************************/
        //    /* Add new element to table                                             */
        //    /************************************************************************/

        //    public void AddNewData(testDataContext mydb, int uint16_COUNT, int st_blis1, int st_blis2, int st_blis3,
        //        int st_blis4, int st_blis5, int st_blis6)
        //    {
        //        TimeSpan TimeNow;
        //        DateTime LocalTime;
        //        LocalTime = DateTime.Now;
        //        TimeNow = new TimeSpan(LocalTime.Hour, LocalTime.Minute, LocalTime.Second);
        //        blister newSample = new blister
        //                            {
        //                                COUNT = uint16_COUNT,
        //                                TIME = TimeNow,
        //                                BLIS1 = st_blis1,
        //                                BLIS2 = st_blis2,
        //                                BLIS3 = st_blis3,
        //                                BLIS4 = st_blis4,
        //                                BLIS5 = st_blis5,
        //                                BLIS6 = st_blis6,

        //                            };
        //        mydb.blister.InsertOnSubmit(newSample);
        //        // Submit the change to the database. 
        //        mydb.SubmitChanges();
        //    }
        //}

        private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

            if ((sending_flag == 0) && (lbConnect.Text == "Connect"))
            {
                try
                {
                    //   Com.ReadTimeout = 100;                 
                    //chuoi = Com.ReadExisting();
                    test1 = true;

                }
                catch
                {
                    return;
                }
                Com.DiscardInBuffer(); //clear INbuffer to ready receive new data              

                //  Application.Idle -= dat_showcam;
                //display a tring from uart


                // imageBox3.Refresh();
                // Application.Idle -= showcam;
                //Luuhinh();
                // datareceive = true;
                // Application.Idle += new EventHandler(showcam);
                // Display(chuoi);


                //guichuoiquaUart();                                     //send result to uart

            }
        }

        private delegate void DlDisplay(string chuoi);

        private void Display(string chuoi)
        {
            if (receive.InvokeRequired)
            {
                DlDisplay sd = new DlDisplay(Display);
                receive.Invoke(sd, new object[] { chuoi });
                receive.Text = chuoi;
            }
            else
            {
                receive.AppendText(chuoi);
            }
        }

        private void guichuoiquaUart()
        {
            Gui = "8";
            Buf = "";
            //Thread.Sleep(100);
            for (int i = 1; i <= 6; i++)
            {
                if (blister_error[i] != 0)
                {
                    Gui = Gui + Convert.ToString(i);
                }
            }
            for (int i = B; i > 0; i--)
            {
                buffer[i] = buffer[i - 1];
            }
            buffer[0] = Gui;
            sending_flag = 1;
            Buf = buffer[B] + 'e';
            Com.Write(Buf);
            receive.Text = Buf;
            sending_flag = 0;

        }

        private void DELAY_Click(object sender, EventArgs e)
        {
            B = (Int32.Parse(bodem.Text)) - 1;
        }

        private void butConnect_Click(object sender, EventArgs e)
        {
            if (SelCom == "") //initially,SelCom did not set 
            {
                MessageBox.Show("Select NewConnection to start connect");
            }
            else
            {
                if (lbConnect.Text == "Connect")
                {
                    Com.Close();
                    lbConnect.Text = "Disconnect";
                    butConnect.Text = "Connect";
                }
                else
                {
                    // Com.PortName = SelCom;
                    Com.Open();
                    lbConnect.Text = "Connect";
                    butConnect.Text = "Disconnect";
                }
            }
        }


        private void newConnection_Click(object sender, EventArgs e)
        {
            Com.Close();
            SelCom = "";
            formuartconnect frmUart = new formuartconnect();
            frmUart.ShowDialog();

            if (SelCom != "")
            {
                //ok let's active com port
                Com.PortName = SelCom;
                Com.Open();
                Com.BaudRate = Baudrate;
                Com.DataBits = Databits;
                Com.StopBits = Stopbits;
                Com.Parity = Parity;
                lbConnect.Text = "Connect";
                butConnect.Text = "Disconnect";
            }
            else
            {
                lbConnect.Text = "Disconnect";
                butConnect.Text = "Connect";
            }
        }

        private void Reset_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 10; i++)
            {
                buffer[i] = "";
            }
        }




        private void trBar_s_Scroll(object sender, DragEventArgs e)
        {

        }

             
        private void trBar_h_ValueChanged(object sender, EventArgs e)
        {
            Process.ColorInrange(is_hsv, is_ycc, _hsvImage1, _yccImage1, out _grayImage2, average[0], average[1],
                average[2], trBar_h_low.Value, trBar_s_low.Value, trBar_v_low.Value, trBar_h.Value, trBar_s.Value, trBar_v.Value);
            numeric_h.Value = trBar_h.Value;
            trBar_h.Text = (trBar_h.Value - average[0]).ToString();
            _grayImage2 = FilterImage.NoisyFilter(_grayImage2);
            if (erodeimage)
            {
                _grayImage2 = _grayImage2.Erode(Int32.Parse(txt_Erode.Text));
            }
            if (dilateimage)
            {
                _grayImage2 = _grayImage2.Dilate(Int32.Parse(txt_Dilate.Text));
            }

            if (colorinrange == true)
            {
                imageBox1.Image = _grayImage2;
            }
        }

        private void trBar_s_ValueChanged(object sender, EventArgs e)
        {

            Process.ColorInrange(is_hsv, is_ycc, _hsvImage1, _yccImage1, out _grayImage2, average[0], average[1],
                average[2], trBar_h_low.Value, trBar_s_low.Value, trBar_v_low.Value, trBar_h.Value, trBar_s.Value, trBar_v.Value);
            numeric_s.Value = trBar_s.Value;
            trBar_s.Text = (trBar_s.Value - average[1]).ToString();
            _grayImage2 = FilterImage.NoisyFilter(_grayImage2);
            if (erodeimage)
            {
                _grayImage2 = _grayImage2.Erode(Int32.Parse(txt_Erode.Text));
            }
            if (dilateimage)
            {
                _grayImage2 = _grayImage2.Dilate(Int32.Parse(txt_Dilate.Text));
            }
            if (colorinrange == true)
            {
                imageBox1.Image = _grayImage2;
            }
        }


        private void trBar_v_ValueChanged(object sender, EventArgs e)
        {
            Process.ColorInrange(is_hsv, is_ycc, _hsvImage1, _yccImage1, out _grayImage2, average[0], average[1],
                average[2],trBar_h_low.Value, trBar_s_low.Value, trBar_v_low.Value,  trBar_h.Value, trBar_s.Value, trBar_v.Value);
            numeric_v.Value = trBar_v.Value;
            trBar_v.Text = (trBar_v.Value - average[2]).ToString();
            _grayImage2 = FilterImage.NoisyFilter(_grayImage2);
            if (erodeimage)
            {
                _grayImage2 = _grayImage2.Erode(Int32.Parse(txt_Erode.Text));
            }
            if (dilateimage)
            {
                _grayImage2 = _grayImage2.Dilate(Int32.Parse(txt_Dilate.Text));
            }
            if (colorinrange == true)
            {
                imageBox1.Image = _grayImage2;
            }
        }

      
        private void Ra_hsv_CheckedChanged(object sender, EventArgs e)
        {
            if (Ra_hsv.Checked == true)
            {
                is_hsv = true;
            }
            else
            {
                is_hsv = false;
            }
        }

        private void Ra_ycc_CheckedChanged(object sender, EventArgs e)
        {
            if (Ra_ycc.Checked == true)
            {
                is_ycc = true;
            }
            else
            {
                is_ycc = false;
            }
        }

        private void RaBtn_Round_CheckedChanged(object sender, EventArgs e)
        {
            if (RaBtn_Round.Checked)
            {
                shape_round = true;
            }
            else
            {
                shape_round = false;
            }
        }
        private void RaBtn_Square_CheckedChanged(object sender, EventArgs e)
        {
            if (RaBtn_Square.Checked)
            {
                shape_square = true;
            }
            else
            {
                shape_square = false;
            }
        }

        private void RaBtn_Ellipse_CheckedChanged(object sender, EventArgs e)
        {
            if (RaBtn_Ellipse.Checked)
            {
                shape_ellipse = true;
            }
            else
            {
                shape_ellipse = false;
            }
        }

        private void RaBtn_Capsule_CheckedChanged(object sender, EventArgs e)
        {
            if (RaBtn_Capsule.Checked)
            {
                shape_capsule = true;
            }
            else
            {
                shape_capsule = false;
            }
        }



        private void trBar_v_Scroll(object sender, DragEventArgs e)
        {

        }
        private void btn_LoadImageAndData_Click(object sender, EventArgs e)
        {
            string path1 = newload.LoadImageFromFile("Load Image And Data", "jpg");
            if (path1 == "")
            {
                return;
            }
            else
            {
                Image<Hsv, Byte> hsvImage3 = new Image<Hsv, Byte>(path1);
                imageBox2.Image = hsvImage3;
                var temp = File.ReadAllText(path1.Replace(new FileInfo(path1).Extension, ".json"));
                _newdata = JsonConvert.DeserializeObject<BlisterFeatures>(temp);
            }
        }
        private void btn_AddItem_Click(object sender, EventArgs e)
        {
            LoadImage load_item = new LoadImage();
            path_item = load_item.LoadImageFromFile("Choose Item To Add", "json");
            if (path_item != "")
            {


                var temp = File.ReadAllText(path_item);
                list_item = JsonConvert.DeserializeObject<HashSet<string>>(temp);
                listBox1.Items.Clear();
                foreach (var item in list_item)
                {

                    listBox1.Items.Add(new FileInfo(item).Name);
                }
            }
            else
            {
                return;
            }
            // var string_list_item = JsonConvert.SerializeObject(list_item);
            //  File.WriteAllText(path_item, string_list_item);
        }

        private void btn_RemoveItem_Click(object sender, EventArgs e)
        {
            int count_item = list_item.Count;
            bool[] search_result = new bool[count_item + 1];
            int index = 1;
            foreach (var item in list_item)
            {
                search_result[index] = new FileInfo(item).FullName.Contains(listBox1.SelectedItem.ToString());
                if (search_result[index])
                {
                    list_item.Remove(item);
                    break;
                }
                index++;
            }
            var string_list_item = JsonConvert.SerializeObject(list_item);
            File.WriteAllText(path_item, string_list_item);
            listBox1.Items.Clear();
            foreach (var item in list_item)
            {

                listBox1.Items.Add(new FileInfo(item).Name);
            }
        }

        private void btn_Reset_Click(object sender, EventArgs e)
        {
            Application.Restart();
            System.Environment.Exit(0);
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            int count_item = list_item.Count;
            bool[] search_result = new bool[count_item + 1];
            int index = 1;
            if (listBox1.SelectedItem != null)
            {
                foreach (var item in list_item)
                {
                    search_result[index] = new FileInfo(item).FullName.Contains(listBox1.SelectedItem.ToString());

                    if (search_result[index])
                    {

                        Image<Hsv, Byte> hsvImage3 = new Image<Hsv, Byte>(item);
                        imageBox4.Image = hsvImage3;
                        var temp = File.ReadAllText(item.Replace(new FileInfo(item).Extension, ".json"));
                        _newdata = JsonConvert.DeserializeObject<BlisterFeatures>(temp);
                        if (disablelight == true)   //nhớ sửa lại true --> false
                        {
                            if (_newdata.Brightness.Backlight != 10 && _newdata.Brightness.Frontlight == 10)
                            {
                                radio_Backlight.Checked = true;
                                numeric_backbright.Value = _newdata.Brightness.Backlight;
                            }
                            if (_newdata.Brightness.Backlight == 10 && _newdata.Brightness.Frontlight != 10)
                            {
                                radio_Frontlight.Checked = true;
                                numeric_Frontbright.Value = _newdata.Brightness.Frontlight;
                            }
                            if (_newdata.Brightness.Backlight != 10 && _newdata.Brightness.Frontlight != 10)
                            {
                                radio_Bothlight.Checked = true;
                                numeric_Frontbright.Value = _newdata.Brightness.Frontlight;
                                numeric_backbright.Value = _newdata.Brightness.Backlight;
                            }
                            frontlight_adjust(_newdata.Brightness.Frontlight);
                            backlight_adjust(_newdata.Brightness.Backlight);
                        }
                        return;
                    }
                    index++;
                }
            }
        }

        private void img_mousedown(object sender, MouseEventArgs e)     // sự kiện nhấp chuột
        {
            if (chk_Enable.Checked == true)
            {
                Mouse_is_down = true;
                MouseEventInImageBox newmouse = new MouseEventInImageBox();
                newmouse.MouseDownEvent(e, out rect_initialX, out rect_initialY, out rect_width, out rect_height);      
                /* hàm này trả về giá trị tọa độ x,y ban đầu (rect_initialX, out rect_initialY) ngay khi nhấp chuột(đơn vị pixel).
                 * chiều dài và chiều rộng ban đầu (rect_width, rect_height) được gán bằng 0*/
            }
        }

        private void img_mousemove(object sender, MouseEventArgs e)     // sự kiện di chuyển chuột trong khi nhấp
        {
            if (chk_Enable.Checked == true)
            {
                if (Mouse_is_down == true)
                {
                    this.Refresh();
                    drawPen = new Pen(Color.Navy, 1);       // set up màu và độ dày nét vẽ đường bao
                    rect_width = e.X - rect_initialX;       // chiều dài đường bao bằng (tọa độ con trỏ chuột - tọa độ ban đầu)
                    rect_height = e.Y - rect_initialY;
                    rect = new Rectangle(rect_initialX, rect_initialY, rect_width, rect_height);        
                    /* tạo hình chữ nhật mới với các giá trị khởi tạo(constructor) mới tính được gồm: 
                     * tọa độ điểm bắt đầu, chiều dài, chiều rộng*/

                    formGraphics = formGraphics ?? imageBox1.CreateGraphics();
                    formGraphics.DrawRectangle(drawPen, rect);
                }
            }
        }

        private void img_mouseup(object sender, MouseEventArgs e)       // sự kiện khi thả chuột
        {
            Mouse_is_down = false;

            if (chk_Enable.Checked == true)
            {
                /* đầu tiên, Redraw_Contour_Pack mặc định = true, ta chỉ cần check vào Enable Draw để vẽ đường bao cho cả 6 vỉ,
                 * sau khi nhấn Apply Contour Pack thì hàm "btn_ApplyContour_Click" sẽ chuyển Redraw_Contour_Pack = false.
                 * lúc này ta tiếp tục vẽ đường bao cho viên thuốc, khi thả chuột ra thì nó sẽ hiểu là đường bao đang vẽ là cho 1 viên thuốc.
                */
                if (Redraw_Contour_Pack == true)
                {
                    #region khối lệnh này thực hiện khi vẽ đường bao cho các vỉ thuốc

                    if (rect.Width < 0.5 * imageBox1.Width)
                    {
                        this.Refresh();
                        return;
                    }
                    rectROI = new Rectangle(rect.X * ratio_resize, rect.Y * ratio_resize, rect.Width * ratio_resize,
                        rect.Height * ratio_resize);
                    this.Refresh();
                    //number_of_row = Int32.Parse(cbb_row.SelectedItem.ToString());
                    //number_of_column = Int32.Parse(cbb_column.SelectedItem.ToString());
                    number_of_row = Int32.Parse(cbb_row.Text.ToString());
                    number_of_column = Int32.Parse(cbb_column.Text.ToString());
                    // MessageBox.Show("row " + row + "_column " + column);
                    tempx = rect_initialX;
                    tempy = rect_initialY;
                    var toado = new int[number_of_row * number_of_column * 2];
                    for (int i = 0; i < number_of_column; i++)
                    {
                        for (int j = 0; j < number_of_row; j++)
                        {
                            formGraphics.DrawRectangle(drawPen,
                                rect =
                                    new Rectangle(rect_initialX, rect_initialY, rect_width / number_of_column,
                                        rect_height / number_of_row));
                            int stt = number_of_row * i + j + 1;
                            toado[stt * 2 - 2] = rect_initialX;
                            toado[stt * 2 - 1] = rect_initialY;
                            formGraphics.DrawString("" + stt, new Font("arial", 20), Brushes.Black, rect_initialX + 10,
                                rect_initialY + 10);
                            rect_initialY = rect_initialY + rect_height / number_of_row;
                        }
                        rect_initialY = tempy;
                        rect_initialX = tempx + (i + 1) * rect_width / number_of_column;

                    }
                    #endregion
                }

                else    // Redraw_Contour_Pack == false
                {
                    #region khối lệnh này thực hiện khi vẽ đường bao cho 1 viên thuốc
                    rect10 = new Rectangle(rect_initialX * ratio_resize, rect_initialY * ratio_resize,
                        rect_width * ratio_resize, rect_height * ratio_resize);     
                    /* tạo một hình chữ nhật có tọa độ điểm bắt đầu, chiều dài, chiều rộng được scale với
                     * hình chữ nhật mới được tạo ra bởi "mousemove" với tí lệ "ratio_resize"*/

                    MouseEventInImageBox mouseevent = new MouseEventInImageBox();
                    if (shape_round)
                    {
                        #region
                        mouseevent.MouseUp_DetectCircle(is_hsv, is_ycc, _hsvImage, _yccImage, out _hsvImageROI,
                            out _yccImageROI, rect10, out _circles, out average, thresholdcircle, Int32.Parse(txt_ThresholdCircle.Text));

                        if (_circles.Count() != 0)
                        {
                            if (is_hsv)
                            {
                                imageBox1.Image = _hsvImageROI;

                            }
                            else if (is_ycc)
                            {
                                imageBox1.Image = _yccImageROI;

                            }

                        }
                        else
                        {
                            MessageBox.Show("No circle detected");
                            return;
                        }
                    #endregion
                    }
                    else if (shape_ellipse)
                    {
                        #region
                        mouseevent.Mouseup_Detectellipse(is_hsv, is_ycc, _hsvImage, _yccImage, out _hsvImageROI,
                           out _yccImageROI, rect10, out average, out true_shape, Int32.Parse(txt_ThresholdCircle.Text));

                        imageBox5.Image = _hsvImageROI;
                        if (true_shape)
                        {
                            if (is_hsv)
                            {
                                imageBox1.Image = _hsvImageROI;


                            }
                            else if (is_ycc)
                            {
                                imageBox1.Image = _yccImageROI;

                            }

                        }
                        else
                        {
                            MessageBox.Show("No ellipse detected");
                            return;
                        }
                        #endregion
                    }
                    else if (shape_square) 
                    {
                        #region
                        //gọi sự kiện chuột phát hiện hình vuông
                        mouseevent.MouseUp_DetectSquare(is_hsv, is_ycc, _hsvImage, _yccImage, out _hsvImageROI,
                           out _yccImageROI, rect10, out average, out true_shape, Int32.Parse(txt_ThresholdCircle.Text));

                        imageBox5.Image = _hsvImageROI;

                        if (true_shape)
                        {
                            if (is_hsv)
                            {
                                imageBox1.Image = _hsvImageROI;



                            }
                            else if (is_ycc)
                            {
                                imageBox1.Image = _yccImageROI;

                            }

                        }
                        else
                        {
                            MessageBox.Show("No squares  detected");
                            return;
                        }
                        #endregion
                    }
                    else if (shape_capsule)
                    {
                         #region
                        //gọi sự kiện chuột phát hiện hình con nhộng
                        mouseevent.MouseUp_DetectCapsule(is_hsv, is_ycc, _hsvImage, _yccImage, out _hsvImageROI,
                           out _yccImageROI, rect10, out average, out true_shape, Int32.Parse(txt_ThresholdCircle.Text));

                        imageBox5.Image = _hsvImageROI;
                       
                        if (true_shape)
                        {
                            if (is_hsv)
                            {
                                imageBox1.Image = _hsvImageROI;

                            }
                            else if (is_ycc)
                            {
                                imageBox1.Image = _yccImageROI;

                            }

                        }
                        else
                        {
                            MessageBox.Show("No capsules  detected");
                            return;
                        }
                        #endregion
                    }
                    txtBox_average_h.Text = "" + average[0];
                    txtBox_average_s.Text = "" + average[1];
                    txtBox_average_v.Text = "" + average[2];

                    trBar_h.Value = trBar_h_low.Value = average[0];
                    trBar_s.Value = trBar_s_low.Value = average[1];
                    trBar_v.Value = trBar_v_low.Value = average[2];

                    number_of_tablets = Int32.Parse(txtBox_Blister.Text);
                    #endregion
                }
            }
        }

        //private void btn_LoadFile_Click(object sender, EventArgs e)
        //{
        //    string temp_path = "";
        //    if (_pathImage != "")
        //    {
        //        temp_path = _pathImage;
        //    }
        //    _pathImage = "";
        //    _pathImage = newload.LoadImageFromFile("Load Image To Training", "jpg");
        //    if (_pathImage == "")
        //    {
        //        if (temp_path != "")
        //        {
        //            _pathImage = temp_path;
        //        }
        //        return;
        //    }
        //    else
        //    {
        //        _bgrImage = new Image<Bgr, Byte>(_pathImage);
        //        _hsvImage = new Image<Hsv, Byte>(_pathImage);
        //        _yccImage = new Image<Ycc, Byte>(_pathImage);
        //        imageBox1.Image = _hsvImage;
        //        ratio_resize = _hsvImage.Width/imageBox1.Width;
        //        _hsvImage1 = _hsvImage.Copy();
        //        _yccImage1 = _yccImage.Copy();
        //        _grayImage2 = new Image<Gray, Byte>(_hsvImage1.Width, _hsvImage1.Height);
        //        txtBox_Path.Text = _pathImage;
        //    }
        //}



     

        private void btn_LiveImage_Click(object sender, EventArgs e)
        {
            #region code cũ (dùng cho camera thường)
            //btn_LiveImage.Enabled = false;
            //btn_Capture.Enabled = true;
            // đoạn này không dùng vì kết nối camera công nghiệp. nếu dùng camera thường thì dùng lại
            //_capture = new Capture();
            //btn_Capture.Enabled = true;
            //_capture.SetCaptureProperty(CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, frame_width);
            //_capture.SetCaptureProperty(CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, frame_height);
            //Application.Idle += new EventHandler(showcam);
            #endregion

            icImagingControl1.Visible = true;
            icImagingControl1.LiveDisplayDefault = false;
            icImagingControl1.LiveDisplayZoomFactor = 0.4f;

            #region code mới (dùng camera công nghiệp)
            if (icImagingControl1.LiveVideoRunning)
            {
                icImagingControl1.LiveStop();
                btn_LiveImage.Text = "Start Live";

            }
            else
            {
                icImagingControl1.LiveStart();
                btn_LiveImage.Text = "Stop Live";

            }
            
            

            #endregion

        }
        /* Do kết nối với camera công nghiệp dùng tool IC COntrol nên tạm thời không dùng đoạn này (đoạn này dùng cho camera thường)
        private void showcam(object sender, EventArgs e)
        {
            _bgrImage1 = _capture.QueryFrame();
            showimage(_bgrImage1);
        }

        private void showimage(Image<Bgr, Byte> _bgrImage1)
        {
            if (btn_LiveImage.Enabled == false)
            {
                imageBox1.Image = _bgrImage1;
                //icImagingControl1.
            }
            else if (btn_start_live.Enabled == false || datareceive == true)
            {
                imageBox2.Image = _bgrImage1;
            }

        }
        */
        private void btn_Capture_Click(object sender, EventArgs e)
        {
            #region code cũ
            //Application.Idle -= showcam; 
            //btn_LiveImage.Enabled = true;
            //btn_Capture.Enabled = false;
            //string _pathImage2 = newload.SaveImageToFile("Save Image To Training");  // _pathImage2 chứa đường dẫn ảnh mới chụp từ camera
            //if (_pathImage2 != "")
            //{

            //    _bgrImage1.Save(_pathImage2);
            //    _pathImage = _pathImage2;
            //    _bgrImage = _bgrImage1;
            //    _hsvImage = _bgrImage.Convert<Hsv, Byte>();
            //    _yccImage = _bgrImage.Convert<Ycc, Byte>();
            //    // _bgrImage = new Image<Bgr, Byte>(_pathImage);
            //    //_hsvImage = new Image<Hsv, Byte>(_pathImage);
            //    //  _yccImage = new Image<Ycc, Byte>(_pathImage);
            //    imageBox1.Image = _hsvImage;
            //    ratio_resize = _hsvImage.Width / imageBox1.Width;
            //    _hsvImage1 = _hsvImage.Copy();
            //    _yccImage1 = _yccImage.Copy();
            //    _grayImage2 = new Image<Gray, Byte>(_hsvImage1.Width, _hsvImage1.Height);
            //    txtBox_Path.Text = _pathImage;
            //}
            #endregion

            #region code mới
            // Snap an image.
            icImagingControl1.MemorySnapImage();
            //// Copy the last grabbed image to the PictureBox control
            //pictureBox1.Image = icImagingControl1.ImageActiveBuffer.Bitmap;

            if (icImagingControl1.LiveVideoRunning)
            {
                icImagingControl1.LiveStop();
                btn_LiveImage.Text = "Start Live";

            }

            // Call the save file dialog to enter the filename of the image
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.Filter = "jpeg files (*.jpg)|*.jpg|All files (*.*)|*.*";
            saveFileDialog1.FilterIndex = 1;
            saveFileDialog1.RestoreDirectory = true;

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)    // nếu người dùng nhấn ok
            {
                // Save the image with 100% quality.
                icImagingControl1.ImageActiveBuffer.SaveAsJpeg(saveFileDialog1.FileName, 100);
                _pathImage = saveFileDialog1.FileName;
                _bgrImage = new Image<Bgr, Byte>(_pathImage);
                _bgrImage = _bgrImage.Resize(1280, 960, INTER.CV_INTER_LINEAR, true);   // resize file ảnh thành 1280 x 960
                _hsvImage = _bgrImage.Convert<Hsv, Byte>();
                _yccImage = _bgrImage.Convert<Ycc, Byte>();

                imageBox1.Image = _hsvImage;
                icImagingControl1.Visible = false;
                ratio_resize = _hsvImage.Width / imageBox1.Width;
                _hsvImage1 = _hsvImage.Copy();
                _yccImage1 = _yccImage.Copy();
                _grayImage2 = new Image<Gray, Byte>(_hsvImage1.Width, _hsvImage1.Height);
                txtBox_Path.Text = _pathImage;
            }

            #endregion
        }

        private void btn_ApplyContour_Click(object sender, EventArgs e)
        {

            Redraw_Contour_Pack = !Redraw_Contour_Pack;
            if (Redraw_Contour_Pack == false)
            {
                btn_ApplyContour.Text = "Redraw Contour Pack";

            }
            else
            {
                btn_ApplyContour.Text = "Apply Contour Pack";
            }

        }

        /* - tính diện tích trung bình của viên thuốc,
           - vẽ biên cho toàn bộ bức ảnh, 
           - tìm tọa độ của tất cả viên thuốc rồi sắp xếp lại,
           - đánh số thứ tự cho tất cả các viên thuốc */
        private void btn_DrawContours_Click(object sender, EventArgs e)
        {
            CvInvoke.cvSetImageROI(_grayImage2, rectROI);       // _grayImage2: ảnh đen trắng của các viên thuốc
            area = _grayImage2.CountNonzero()[0];             /* khi ta kéo xong 3 thanh h,s,v lúc này imagebox1 là hình đen trắng,
                                                               * màu trắng là viên thuốc. sau đó ta nhấn vào DrawContours để đếm số
                                                               * Pixel khác 0 (màu trắng) là tổng diện tích các viên thuốc*/

            area_average = area / number_of_tablets;          // diện tích trung bình 1 viên thuốc = tổng diện tích/ số viên thuốc
            CvInvoke.cvResetImageROI(_grayImage2);
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            int distance_max = 0, distance_min = 0;

            average_radius = 0;
            font1 = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_TRIPLEX, 1, 1);
            if (shape_round)
            {
                #region
                num = 0;
                distance_min = distance_max = (int)_circles[0].Radius;
                newtoado = new Rectangle[number_of_tablets + 1];
                _contours = _grayImage2.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
                    Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST);
                while (_contours != null)
                {
                    if (_contours.BoundingRectangle.X > rectROI.X && _contours.BoundingRectangle.Y > rectROI.Y)
                    {
                        if (_contours.BoundingRectangle.X < rectROI.X + rectROI.Width &&
                            _contours.BoundingRectangle.Y < rectROI.Y + rectROI.Height)
                        {
                            if (_contours.Area > area_average / 2 && _contours.Area < area_average * 2)
                            {
                                _hsvImage1.Draw(_contours.BoundingRectangle, new Hsv(0, 0, 0), 4);
                                newtoado[num + 1].X = _contours.BoundingRectangle.X;
                                newtoado[num + 1].Y = _contours.BoundingRectangle.Y;
                                newtoado[num + 1].Width = _contours.BoundingRectangle.Width;
                                newtoado[num + 1].Height = _contours.BoundingRectangle.Height;
                                average_radius = average_radius +
                                                 Math.Min(_contours.BoundingRectangle.Width,
                                                     _contours.BoundingRectangle.Height);
                                num++;
                            }



                        }
                    }
                    _contours = _contours.HNext;
                }
                average_radius = average_radius / number_of_tablets;
                #endregion
            }
            else if (shape_ellipse)
            {
                #region

                newtrain.DrawContourEllipse(_grayImage2, _hsvImage, out _hsvImage1, number_of_tablets, out newtoado, rect10, rectROI);
                //  imageBox2.Image = _hsvImage1;
                distance_min = Math.Min(newtoado[1].Height, newtoado[1].Width);
                distance_max = Math.Max(newtoado[1].Height, newtoado[1].Width);
                #endregion

            }
            else if (shape_capsule)
            {
                if ((RaBtn_1stHalf.Checked == false) && (RaBtn_2ndHalf.Checked == false))
                {
                    newtrain.DrawContourCapsule(_grayImage2, _hsvImage, out _hsvImage1, number_of_tablets, out newtoado, rect10, rectROI);
                    //  imageBox2.Image = _hsvImage1;
                    distance_min = Math.Min(newtoado[1].Height, newtoado[1].Width);
                    distance_max = Math.Max(newtoado[1].Height, newtoado[1].Width);
                }
                else if ((RaBtn_1stHalf.Checked == true) | (RaBtn_2ndHalf.Checked == true))
                {
                    newtrain.DrawContourHalfCapsule(_grayImage2, _hsvImage, out _hsvImage1, number_of_tablets, out newtoado, rect10, rectROI);
                    distance_min = Math.Min(newtoado[1].Height, newtoado[1].Width);
                    distance_max = Math.Max(newtoado[1].Height, newtoado[1].Width);
                }
            }
            else if (shape_square)
            {
                #region
                // _hsvImage = _hsvImage1
                newtrain.DrawContourSquare(_grayImage2, _hsvImage, out _hsvImage1, number_of_tablets, out newtoado, rect10, rectROI);
                //imageBox5.Image = _hsvImage1;
                distance_min = Math.Min(newtoado[1].Height, newtoado[1].Width);
                distance_max = Math.Max(newtoado[1].Height, newtoado[1].Width);
                #endregion
            }

            // sắp xếp lại tọa độ các viên thuốc trên vỉ thuốc
            newtrain.Arrange_CoOrdinate(newtoado, number_of_tablets, distance_min, distance_max);

            // đánh số thứ tự cho từng viên thuốc: từ trên xuống dưới, từ trái qua phải
            for (int i = 1; i <= number_of_tablets; i++)
            {
                _hsvImage1.Draw(i.ToString(), ref font1,
                    new Point(newtoado[i].X, newtoado[i].Y), new Hsv(0, 0, 0));

            }


            imageBox1.Image = _hsvImage1;
            stopwatch.Stop();
            //MessageBox.Show("" + stopwatch.ElapsedMilliseconds + "_" + blister);

        }

        private void btn_Save_Click(object sender, EventArgs e)
        {
            #region lưu lại tạm thời những đặc tính của viên thuốc như: hình dạng, dài, rộng, h,s,v, range_h, range_s, range_v
            int newy = 0,
            newcr = 0,
            newcb = 0,
            newlow_y = 0,
            newlow_cr = 0,
            newlow_cb = 0,
            newhigh_y = 0,
            newhigh_cr = 0,
            newhigh_cb = 0,
            newh = 0,
            news = 0,
            newv = 0,
            newlow_h = 0,
            newlow_s = 0,
            newlow_v = 0,
            newhigh_h = 0,
            newhigh_s = 0,
            newhigh_v = 0,
            dai = 0,
            rong = 0,
            light_b = 10,
            light_f = 10;
                if (shape_round)
                {
                    shape = RaBtn_Round.Text;
                    dai = rong = average_radius;

                }
                else if (shape_ellipse)
                {
                    shape = RaBtn_Ellipse.Text;
                    dai = newtoado[1].Height;
                    rong = newtoado[1].Width;
                }
                else if (shape_capsule)
                {
                    shape = RaBtn_Capsule.Text;
                    dai = newtoado[1].Height;
                    rong = newtoado[1].Width;
                }
                else if (shape_square)
                {
                    shape = RaBtn_Square.Text;
                    dai = newtoado[1].Height;
                    rong = newtoado[1].Width;
                }

                if (is_hsv)
                {
                    newh = average[0];
                    news = average[1];
                    newv = average[2];
                    newhigh_h = trBar_h.Value;
                    newhigh_s = trBar_s.Value;
                    newhigh_v = trBar_v.Value;
                    newlow_h = trBar_h_low.Value;
                    newlow_s = trBar_s_low.Value;
                    newlow_v = trBar_v_low.Value;
                }
                if (is_ycc)
                {

                    newy = average[0];
                    newcb = average[1];
                    newcr = average[2];
                    newhigh_y = trBar_h.Value;
                    newhigh_cb = trBar_s.Value;
                    newhigh_cr = trBar_v.Value;
                    newlow_y = trBar_h.Value;
                    newlow_cb = trBar_s.Value;
                    newlow_cr = trBar_v.Value;

                }
                if (radio_Backlight.Checked)
                {
                    light_b = (int)numeric_backbright.Value;
                }
                if (radio_Frontlight.Checked)
                {
                    light_f = (int)numeric_Frontbright.Value;

                }
                if (radio_Bothlight.Checked)
                {
                    light_b = (int)numeric_backbright.Value;
                    light_f = (int)numeric_Frontbright.Value;
                }
            #endregion 

                if (shape_capsule == false)     // nếu không phải viên con nhộng
                {

                    #region nếu viên thuốc chỉ một màu hoặc 2 màu nhưng đang training màu thứ nhất, ta lưu toàn bộ thông số vị trí, màu sắc thứ nhất... vào data

                    //if ((data.is_twoColor == false) | ((data.is_twoColor == true) && (check_half == "1st")))
                    if ((data.is_twoColor == false) | ((data.is_twoColor == true) && (RaBtn_1stHalf.Checked == true)))
                    {
                        //btn_DrawContours.Enabled = false;
                        //check_half = "2nd";

                        data.font = font1;
                        data.BlisterImagePath = _pathImage;
                        data.TabletShape = shape;
                        data.TabletPosition = newtoado;

                        data.Brightness.Frontlight = light_f;
                        data.Brightness.Backlight = light_b;

                        data.TabletColor.mau_hsv.H = newh;
                        data.TabletColor.mau_hsv.S = news;
                        data.TabletColor.mau_hsv.V = newv;
                        data.TabletColor.mau_hsv.low_h = newlow_h;
                        data.TabletColor.mau_hsv.low_s = newlow_s;
                        data.TabletColor.mau_hsv.low_v = newlow_v;
                        data.TabletColor.mau_hsv.high_h = newhigh_h;
                        data.TabletColor.mau_hsv.high_s = newhigh_s;
                        data.TabletColor.mau_hsv.high_v = newhigh_v;

                        data.TabletColor.mau_ycc.Y = newy;
                        data.TabletColor.mau_ycc.Cb = newcb;
                        data.TabletColor.mau_ycc.Cr = newcr;
                        data.TabletColor.mau_ycc.low_y = newlow_y;
                        data.TabletColor.mau_ycc.low_cb = newlow_cb;
                        data.TabletColor.mau_ycc.low_cr = newlow_cr;
                        data.TabletColor.mau_ycc.high_y = newlow_y;
                        data.TabletColor.mau_ycc.high_cb = newlow_cb;
                        data.TabletColor.mau_ycc.high_cr = newlow_cr;

                        data.TabletArea = area_average;
                        data.TabletWidth = dai;
                        data.TabletHeight = rong;

                        data.NumberOfTablet.SoViHang = number_of_row;
                        data.NumberOfTablet.SoViCot = number_of_column;
                        data.NumberOfTablet.SoVienThuoc = number_of_tablets;

                    }
                    #endregion

                    #region nếu viên thuốc có 2 màu và hiện đang training màu thứ 2, thì ta chỉ lưu thêm thông số màu sắc thứ 2 vào data

                    //else if ((data.is_twoColor == true) && (check_half == "2nd"))
                    else if ((data.is_twoColor == true) && (RaBtn_2ndHalf.Checked == true))
                    {
                        data.TabletColor.mau_hsv.H1 = newh;
                        data.TabletColor.mau_hsv.S1 = news;
                        data.TabletColor.mau_hsv.V1 = newv;
                        data.TabletColor.mau_hsv.low_h1 = newlow_h;
                        data.TabletColor.mau_hsv.low_s1 = newlow_s;
                        data.TabletColor.mau_hsv.low_v1 = newlow_v;
                        data.TabletColor.mau_hsv.high_h1 = newhigh_h;
                        data.TabletColor.mau_hsv.high_s1 = newhigh_s;
                        data.TabletColor.mau_hsv.high_v1 = newhigh_v;

                        data.TabletColor.mau_ycc.Y1 = newy;
                        data.TabletColor.mau_ycc.Cb1 = newcb;
                        data.TabletColor.mau_ycc.Cr1 = newcr;
                        data.TabletColor.mau_ycc.low_y1 = newlow_y;
                        data.TabletColor.mau_ycc.low_cb1 = newlow_cb;
                        data.TabletColor.mau_ycc.low_cr1 = newlow_cr;
                        data.TabletColor.mau_ycc.high_y1 = newlow_y;
                        data.TabletColor.mau_ycc.high_cb1 = newlow_cb;
                        data.TabletColor.mau_ycc.high_cr1 = newlow_cr;
                    }
                    #endregion
                }
                else        // nếu là viên con nhộng
                {
                    #region nếu đang training cho cả viên thuốc, ta lưu hết các thông số lại
                    if ((RaBtn_1stHalf.Checked == false) && (RaBtn_2ndHalf.Checked == false))
                    {
                        //btn_DrawContours.Enabled = false;   // khi nhấn save lần đầu tiên, ta lưu lại vị trí các viên thuốc sau đó disable nút "DetectBlister" đi, vì train 2 nửa viên thuốc ko cần đến nó nữa.

                        data.font = font1;
                        data.BlisterImagePath = _pathImage;
                        data.TabletShape = shape;
                        data.TabletPosition = newtoado;

                        data.Brightness.Frontlight = light_f;
                        data.Brightness.Backlight = light_b;
                        data.TabletColor.mau_hsv.H = newh;
                        data.TabletColor.mau_hsv.S = news;
                        data.TabletColor.mau_hsv.V = newv;
                        data.TabletColor.mau_hsv.low_h = newlow_h;
                        data.TabletColor.mau_hsv.low_s = newlow_s;
                        data.TabletColor.mau_hsv.low_v = newlow_v;
                        data.TabletColor.mau_hsv.high_h = newhigh_h;
                        data.TabletColor.mau_hsv.high_s = newhigh_s;
                        data.TabletColor.mau_hsv.high_v = newhigh_v;

                        data.TabletColor.mau_ycc.Y = newy;
                        data.TabletColor.mau_ycc.Cb = newcb;
                        data.TabletColor.mau_ycc.Cr = newcr;
                        data.TabletColor.mau_ycc.low_y = newlow_y;
                        data.TabletColor.mau_ycc.low_cb = newlow_cb;
                        data.TabletColor.mau_ycc.low_cr = newlow_cr;
                        data.TabletColor.mau_ycc.high_y = newlow_y;
                        data.TabletColor.mau_ycc.high_cb = newlow_cb;
                        data.TabletColor.mau_ycc.high_cr = newlow_cr;

                        data.TabletArea = area_average;
                        data.TabletWidth = dai;
                        data.TabletHeight = rong;

                        data.NumberOfTablet.SoViHang = number_of_row;
                        data.NumberOfTablet.SoViCot = number_of_column;
                        data.NumberOfTablet.SoVienThuoc = number_of_tablets;
                    }
                    #endregion

                    #region nếu đang training cho nửa thứ 1, ta chỉ lưu lại thông số màu thứ 1
                    if ((RaBtn_1stHalf.Checked == true) && (RaBtn_2ndHalf.Checked == false))
                    {
                        data.TabletColor.mau_hsv.H1 = newh;
                        data.TabletColor.mau_hsv.S1 = news;
                        data.TabletColor.mau_hsv.V1 = newv;
                        data.TabletColor.mau_hsv.low_h1 = newlow_h;
                        data.TabletColor.mau_hsv.low_s1 = newlow_s;
                        data.TabletColor.mau_hsv.low_v1 = newlow_v;
                        data.TabletColor.mau_hsv.high_h1 = newhigh_h;
                        data.TabletColor.mau_hsv.high_s1 = newhigh_s;
                        data.TabletColor.mau_hsv.high_v1 = newhigh_v;

                        data.TabletColor.mau_ycc.Y1 = newy;
                        data.TabletColor.mau_ycc.Cb1 = newcb;
                        data.TabletColor.mau_ycc.Cr1 = newcr;
                        data.TabletColor.mau_ycc.low_y1 = newlow_y;
                        data.TabletColor.mau_ycc.low_cb1 = newlow_cb;
                        data.TabletColor.mau_ycc.low_cr1 = newlow_cr;
                        data.TabletColor.mau_ycc.high_y1 = newlow_y;
                        data.TabletColor.mau_ycc.high_cb1 = newlow_cb;
                        data.TabletColor.mau_ycc.high_cr1 = newlow_cr;
                    }
                    #endregion

                    #region nếu đang training cho nửa thứ 2, ta chỉ lưu lại thông số màu thứ 2
                    if ((RaBtn_1stHalf.Checked == false) && (RaBtn_2ndHalf.Checked == true))
                    {
                        data.TabletColor.mau_hsv.H2 = newh;
                        data.TabletColor.mau_hsv.S2 = news;
                        data.TabletColor.mau_hsv.V2 = newv;
                        data.TabletColor.mau_hsv.low_h2 = newlow_h;
                        data.TabletColor.mau_hsv.low_s2 = newlow_s;
                        data.TabletColor.mau_hsv.low_v2 = newlow_v;
                        data.TabletColor.mau_hsv.high_h2 = newhigh_h;
                        data.TabletColor.mau_hsv.high_s2 = newhigh_s;
                        data.TabletColor.mau_hsv.high_v2 = newhigh_v;

                        data.TabletColor.mau_ycc.Y2 = newy;
                        data.TabletColor.mau_ycc.Cb2 = newcb;
                        data.TabletColor.mau_ycc.Cr2 = newcr;
                        data.TabletColor.mau_ycc.low_y2 = newlow_y;
                        data.TabletColor.mau_ycc.low_cb2 = newlow_cb;
                        data.TabletColor.mau_ycc.low_cr2 = newlow_cr;
                        data.TabletColor.mau_ycc.high_y2 = newlow_y;
                        data.TabletColor.mau_ycc.high_cb2 = newlow_cb;
                        data.TabletColor.mau_ycc.high_cr2 = newlow_cr;
                    }
                    #endregion
                }

                #region  comments
                /*            // khai báo biến mới đẻ lưu dữ liệu trainning

                BlisterFeatures data = new BlisterFeatures
                               {
                                   font = font1,
                                   BlisterImagePath = _pathImage,
                                   TabletShape = shape,
                                   TabletPosition = newtoado,
                                   Brightness = new Light
                                                {
                                                    Frontlight = light_f,
                                                    Backlight = light_b
                                                },

                                   TabletColor = new MauSac
                                                 {

                                                     mau_hsv = new MauHSV
                                                               {
                                                                   H = newh,
                                                                   S = news,
                                                                   V = newv,
                                                                   range_h = newrange_h,
                                                                   range_s = newrange_s,
                                                                   range_v = newrange_v
                                                               }
                                                     ,
                                                     mau_ycc = new MauYCC
                                                               {
                                                                   Y = newy,
                                                                   Cb = newcb,
                                                                   Cr = newcr,
                                                                   range_y = newrange_y,
                                                                   range_cr = newrange_cr,
                                                                   range_cb = newrange_cb
                                                               }

                                                 }
                                   ,
                                   TabletArea = area_average,
                                   TabletWidth = dai,
                                   TabletHeight = rong,
                                   NumberOfTablet = new So_Luong
                                                    {
                                                        SoViHang = number_of_row,
                                                        SoViCot = number_of_column,
                                                        SoVienThuoc = number_of_tablets
                                                    }

                               };
               */



           
            #endregion 

                #region lưu thông tin biến data vào file .json
                if ((shape_capsule==true)|((shape_capsule==false)&&((data.is_twoColor == false) | ((data.is_twoColor == true) && (RaBtn_2ndHalf.Checked == true)))))
 
                {
                    var duLieuDangChuoi = JsonConvert.SerializeObject(data);    // chuyển tất cả dữ liệu đã được training ở trên về dạng chuỗi

                    File.WriteAllText(_pathImage.Replace(new FileInfo(_pathImage).Extension, ".json"), duLieuDangChuoi);        // lưu file lại dưới dạng đuôi .json
                    var path_item = new FileInfo(_pathImage).DirectoryName + "\\list_item.json";
                    var temp = File.ReadAllText(path_item);
                    list_item = JsonConvert.DeserializeObject<HashSet<string>>(temp) ?? new HashSet<string>();
                    try
                    {
                        list_item.Add(_pathImage);
                    }
                    catch (Exception)
                    {
                        return;
                    }

                    var string_list_item = JsonConvert.SerializeObject(list_item);
                    File.WriteAllText(path_item, string_list_item);
                }
               
                #endregion

            #region comments
            //               #endregion
 //           }
            //else
            //{
            //    #region nếu viên thuốc 2 màu

            //    if (check_half == "1st")
            //    {
            //        #region nếu màu thứ nhất
            //        check_half = "2nd";
            //        var data1 = new BlisterFeatures
            //        {
            //            font = font1,
            //            BlisterImagePath = _pathImage,
            //            TabletShape = shape,
            //            TabletPosition = newtoado,
            //            Brightness = new Light
            //            {
            //                Frontlight = light_f,
            //                Backlight = light_b
            //            },
            //            TabletColor = new MauSac
            //            {
            //                mau_hsv = new MauHSV
            //                {
            //                    H = newh,
            //                    S = news,
            //                    V = newv,
            //                    range_h = newrange_h,
            //                    range_s = newrange_s,
            //                    range_v = newrange_v
            //                }
            //                ,
            //                mau_ycc = new MauYCC
            //                {
            //                    Y = newy,
            //                    Cb = newcb,
            //                    Cr = newcr,
            //                    range_y = newrange_y,
            //                    range_cr = newrange_cr,
            //                    range_cb = newrange_cb
            //                }

            //            }
            //            ,
            //            TabletArea = area_average,
            //            TabletWidth = dai,
            //            TabletHeight = rong,
            //            NumberOfTablet = new So_Luong
            //            {
            //                SoViHang = number_of_row,
            //                SoViCot = number_of_column,
            //                SoVienThuoc = number_of_tablets
            //            }
            //        };

            //        var duLieuDangChuoi = JsonConvert.SerializeObject(data1);    // chuyển tất cả dữ liệu đã được training ở trên về dạng chuỗi

            //        File.WriteAllText(_pathImage.Replace(new FileInfo(_pathImage).Extension, ".json"), duLieuDangChuoi);        // lưu file lại dưới dạng đuôi .json
            //        var path_item = new FileInfo(_pathImage).DirectoryName + "\\list_item.json";
            //        var temp = File.ReadAllText(path_item);
            //        list_item = JsonConvert.DeserializeObject<HashSet<string>>(temp) ?? new HashSet<string>();
            //        try
            //        {
            //            list_item.Add(_pathImage);
            //        }
            //        catch (Exception)
            //        {
            //            return;
            //        }

            //        var string_list_item = JsonConvert.SerializeObject(list_item);
            //        File.WriteAllText(path_item, string_list_item);
            //        imageBox1.Image = _hsvImage;
            //        #endregion
            //    }
            //    if (check_half=="2nd")
            //    {
            //        #region nếu màu thứ 2
            //        var data2 = new BlisterFeatures
            //        {
            //            font = font1,
            //            BlisterImagePath = _pathImage,
            //            TabletShape = shape,
            //            TabletPosition = newtoado,
            //            Brightness = new Light
            //            {
            //                Frontlight = light_f,
            //                Backlight = light_b
            //            },
            //            TabletColor = new MauSac
            //            {
            //                mau_hsv = new MauHSV
            //                {
            //                    H = newh,
            //                    S = news,
            //                    V = newv,
            //                    range_h = newrange_h,
            //                    range_s = newrange_s,
            //                    range_v = newrange_v
            //                }
            //                ,
            //                mau_ycc = new MauYCC
            //                {
            //                    Y = newy,
            //                    Cb = newcb,
            //                    Cr = newcr,
            //                    range_y = newrange_y,
            //                    range_cr = newrange_cr,
            //                    range_cb = newrange_cb
            //                }

            //            }
            //            ,
            //            TabletArea = area_average,
            //            TabletWidth = dai,
            //            TabletHeight = rong,
            //            NumberOfTablet = new So_Luong
            //            {
            //                SoViHang = number_of_row,
            //                SoViCot = number_of_column,
            //                SoVienThuoc = number_of_tablets
            //            }


            //        };

            //        var duLieuDangChuoi = JsonConvert.SerializeObject(data2);    // chuyển tất cả dữ liệu đã được training ở trên về dạng chuỗi

            //        File.WriteAllText(_pathImage.Replace(new FileInfo(_pathImage).Extension, ".json"), duLieuDangChuoi);        // lưu file lại dưới dạng đuôi .json
            //        var path_item = new FileInfo(_pathImage).DirectoryName + "\\list_item.json";
            //        var temp = File.ReadAllText(path_item);
            //        list_item = JsonConvert.DeserializeObject<HashSet<string>>(temp) ?? new HashSet<string>();
            //        try
            //        {
            //            list_item.Add(_pathImage);
            //        }
            //        catch (Exception)
            //        {
            //            return;
            //        }

            //        var string_list_item = JsonConvert.SerializeObject(list_item);
            //        File.WriteAllText(path_item, string_list_item);
            //        #endregion
            //    }

            //    #endregion
            //}
            #endregion
        }

        private void btn_GetImage_Click(object sender, EventArgs e)
        {
            //txt_Result1.Text = " ";
            //txt_Result2.Text = " ";
            //txt_Result3.Text = " ";
            //txt_Result4.Text = " ";
            //txt_Result5.Text = " ";
            //txt_Result6.Text = " ";
            //string path2 = newload.LoadImageFromFile("Get Image", "jpg");
            //if (path2 == "")
            //{
            //    return;
            //}
            //else
            //{
            //    _bgrImage2 = new Image<Bgr, Byte>(path2);
            //    _hsvImage2 = new Image<Hsv, Byte>(path2);
            //    _yccImage2 = new Image<Ycc, Byte>(path2);
            //    imageBox3.Image = _hsvImage2;
            //}
            index = 0;
            var newdialog = new OpenFileDialog();
            newdialog.Filter = "(jpg)|*.jpg";
            newdialog.Title = "Choose Files To Inspection";
            newdialog.Multiselect = true;
            if (newdialog.ShowDialog() == DialogResult.OK)
            {
                toolStripStatusLabel1.Text = "";
                filesname = new string[newdialog.FileNames.Length];

                foreach (var path in newdialog.FileNames)
                {

                    filesname[index] = path;
                    index++;
                }
                index = 0;
            }
            else
            {
                return;
            }
        }

        private void btn_exit_Click(object sender, EventArgs e)
        {
            this.Close();

        }

        private void inspection_program()
        {
            Stopwatch ww = new Stopwatch();
            ww.Start();
            Image<Gray, Byte> _grayImage4 = _hsvImage2.Convert<Gray, Byte>();       // _grayImage4 là tham số của hàm ColorInrange

            #region phần này là của luận văn trước, ColorInrange cả bức ảnh sau đón mới dùng vòng lặp for...do
 /*           #region Đoạn này dùng hàm ColorInrange để phát hiện những pixel nào thuộc vùng màu cho phép, trả về _grayImage4

            if (_newdata.TabletColor.mau_hsv.range_s != 0)
            {
                is_hsv = true;
                is_ycc = false;
                Process.ColorInrange(is_hsv, is_ycc, _hsvImage2, _yccImage2, out _grayImage4,
                    _newdata.TabletColor.mau_hsv.H, _newdata.TabletColor.mau_hsv.S, _newdata.TabletColor.mau_hsv.V,
                    _newdata.TabletColor.mau_hsv.range_h, _newdata.TabletColor.mau_hsv.range_s,
                    _newdata.TabletColor.mau_hsv.range_v);

                //_grayImage4 = Process.ColorInrange(_hsvImage2, _newdata.MauSac.mau_hsv.H,
                //    _newdata.MauSac.mau_hsv.S, _newdata.MauSac.mau_hsv.V, _newdata.MauSac.mau_hsv.range_h,
                //    _newdata.MauSac.mau_hsv.range_s, _newdata.MauSac.mau_hsv.range_v);
            }
            else if (_newdata.TabletColor.mau_ycc.range_cr != 0)
            {
                is_hsv = false;
                is_ycc = true;
                Process.ColorInrange(is_hsv, is_ycc, _hsvImage2, _yccImage2, out _grayImage4,
                    _newdata.TabletColor.mau_ycc.Y, _newdata.TabletColor.mau_ycc.Cb, _newdata.TabletColor.mau_ycc.Cr,
                    _newdata.TabletColor.mau_ycc.range_y, _newdata.TabletColor.mau_ycc.range_cb,
                    _newdata.TabletColor.mau_ycc.range_cr);

                //_grayImage4 = Process.ColorInrange_ycc(_yccImage2, _newdata.MauSac.mau_ycc.Y,
                //  _newdata.MauSac.mau_ycc.Cr, _newdata.MauSac.mau_ycc.Cb, _newdata.MauSac.mau_ycc.range_y,
                //    _newdata.MauSac.mau_ycc.range_cr, _newdata.MauSac.mau_ycc.range_cb);
            }
            #endregion
//            imageBox2.Image = _grayImage4;
            _grayImage4 = FilterImage.NoisyFilter(_grayImage4);     // trong này đã có erode và dilate rồi, 2 cái bên dưới chỉ là option thôi. cần thì làm thêm
            if (erodeimage)
            {
                _grayImage4 = _grayImage4.Erode(Int32.Parse(txt_Erode.Text));
            }
            if (dilateimage)
            {
                _grayImage4 = _grayImage4.Dilate(Int32.Parse(txt_Dilate.Text));
            }
//            imageBox2.Image = _grayImage4;

            // đến đây ta có kết quả là 1 bức ảnh trắng đen của tất cả các viên thuốc
            if (_newdata.TabletShape == "Round")
            {
                shape_round = true;
                shape_ellipse = false;
                shape_square = false;
            }
            else if (_newdata.TabletShape == "Ellipse")
            {
                shape_round = false;
                shape_ellipse = true;
                shape_square = false;
            }
            else if (_newdata.TabletShape == "Square")
            {
                shape_round = false;
                shape_ellipse = false;
                shape_square = true;
            }
            int[,] mangcu = new int[7, 7];
            for (int i = 1; i <= _newdata.NumberOfTablet.SoVienThuoc; i++)      // cho i chạy từ 1--> số viên thuốc
            {
                #region
                int ar = 2;
                int setROI = Int32.Parse(txt_setROI.Text);      // lấy thông tin ROI mà người dùng nhập vào

                // tạo ra 1 hcn rect11 tại viên thuốc thứ i với vị trí và kích thước = với vị trí và kích thước đã lưu vào khi training
                Rectangle rect11 = new Rectangle(_newdata.TabletPosition[i].X, _newdata.TabletPosition[i].Y,
                    _newdata.TabletPosition[i].Width, _newdata.TabletPosition[i].Height);   

                rect = new Rectangle();

                #region mở rộng hcn rect theo lựa chọn của người dùng nhập vào
                rect.X = rect11.X - rect11.Width * (setROI - 100) / 200;
                rect.Y = rect11.Y - rect11.Height * (setROI - 100) / 200;
                rect.Width = rect11.Width * setROI / 100;
                rect.Height = rect11.Height * setROI / 100; 
                #endregion

                #region tạo ra 2 tấm ảnh (có kích thước = rect) của mỗi viên thuốc, 1 tấm trắng đen (_grayImage4), 1 tấm màu (_hsvImageROI2)
                CvInvoke.cvSetImageROI(_grayImage4, rect);              // rect là hcn đã được mở rộng
                Image<Gray, Byte> _grayImage5 = _grayImage4.Copy();     // _grayImage5 = viên thuốc trắng đen
                CvInvoke.cvResetImageROI(_grayImage4);
                CvInvoke.cvSetImageROI(_hsvImage2, rect);
                Image<Hsv, Byte> _hsvImageROI2 = _hsvImage2.Copy();     // _hsvImageROI2 = viên thuốc màu
                CvInvoke.cvResetImageROI(_hsvImage2);
                #endregion


                Image<Gray, Byte> _grayImage6 = _hsvImageROI2.Convert<Gray, Byte>().PyrUp().PyrDown(); 
                if (shape_round)
                {
                    #region
                    Process.CheckShape(_grayImage6, out true_shape, out true_size,
                        Int32.Parse(txt_tolerance_radius.Text), _newdata, thresholdcircle, Int32
                        .Parse(txt_ThresholdCircle.Text));

                    Process.CheckArea(_grayImage5, out true_area, _newdata, Int32.Parse(txt_tolerance_area.Text));
                    #endregion
                }
                else if (shape_ellipse)
                {
                    #region
                    Rectangle newrect;

                    // _grayImage6: ảnh xám của viên thuốc đó
                    // _grayImage5: ảnh trắng đen của viên thuốc đó (ảnh này có được sau khi dùng hàm colorInRange phát hiện)
                    Process.check_shape_ellipse(_grayImage6, _grayImage5, out true_shape, out true_size, out true_area,
                        Int32.Parse(txt_tolerance_radius.Text), Int32.Parse(txt_tolerance_area.Text), _newdata,
                        out newrect, Int32.Parse(txt_ThresholdCircle.Text));

                    // Process.checkEllipse(_grayImage5,_newdata,out true_shape,out true_size,out ar,Int32.Parse(txt_tolerance_radius.Text),Int32.Parse(txt_tolerance_area.Text));
                    #endregion
                }
                else if (shape_square)
                {
                    #region
                    Rectangle newrect;
                    Process.check_shape_square(_grayImage6, _grayImage5, out true_shape, out true_size, out true_area,
                        Int32.Parse(txt_tolerance_radius.Text), Int32.Parse(txt_tolerance_area.Text), _newdata,
                        out newrect, Int32.Parse(txt_ThresholdCircle.Text));
                    #endregion
                }
                // ErrorAndResult.CheckError(i, true_shape, ar, true_size, out error, out result);
                ErrorAndResult.CheckError(i, true_shape, true_area, true_size, out error, out result);
                if (error != 0)
                {
                    mangcu = ErrorAndResult.CheckBlister(i, error, mangcu, _newdata.NumberOfTablet.SoVienThuoc);

                }
                // vẽ lỗi cho từng viên thuốc
                ErrorAndResult.DrawError(error, i, _hsvImage2, rect, _newdata, showerror);   
                #endregion
            }
            imageBox3.Image = _hsvImage2;
            _binaryImage = _grayImage4;
            ww.Stop();
            if (LiveMode_radio.Checked)
            {
                toolStripStatusLabel1.Text = "Processing Time: " + ww.ElapsedMilliseconds + " ms";
            }
            else
            {
                toolStripStatusLabel1.Text = "Processing Time: " + ww.ElapsedMilliseconds + " ms ; File Name: " + filesname[index];
            }
            //   MessageBox.Show("" + ww.ElapsedMilliseconds);
            Sendtodatabase(mangcu);
            return;
            */
            #endregion

            int[,] mangcu = new int[7, 7];

            #region cho i chạy từ 1--> số viên thuốc, kiểm tra xem viên nào bị lỗi và vẽ lỗi cho từng viên đó
            for (int i = 1; i <= _newdata.NumberOfTablet.SoVienThuoc; i++)       
            {
                
                int ar = 2;
                int setROI = Int32.Parse(txt_setROI.Text);      // lấy thông tin ROI mà người dùng nhập vào

                // tạo ra 1 hcn rect11 tại viên thuốc thứ i với vị trí và kích thước = với vị trí và kích thước đã lưu vào khi training
                Rectangle rect11 = new Rectangle(_newdata.TabletPosition[i].X, _newdata.TabletPosition[i].Y,
                    _newdata.TabletPosition[i].Width, _newdata.TabletPosition[i].Height);

                rect = new Rectangle(); // rect là hcn mở rộng

                #region mở rộng hcn rect theo lựa chọn của người dùng nhập vào
                rect.X = rect11.X - rect11.Width * (setROI - 100) / 200;
                rect.Y = rect11.Y - rect11.Height * (setROI - 100) / 200;
                rect.Width = rect11.Width * setROI / 100;
                rect.Height = rect11.Height * setROI / 100;
                #endregion

                #region tạo ra 1 tấm ảnh màu (có kích thước = rect) của mỗi viên thuốc (_hsvImageROI2)

                CvInvoke.cvSetImageROI(_hsvImage2, rect);
                Image<Hsv, Byte> _hsvImageROI2 = _hsvImage2.Copy();     // _hsvImageROI2 = viên thuốc màu hệ HSV
                CvInvoke.cvResetImageROI(_hsvImage2);

                CvInvoke.cvSetImageROI(_yccImage2, rect);
                Image<Ycc, Byte> _yccImageROI2 = _yccImage2.Copy();
                CvInvoke.cvResetImageROI(_yccImage2);                   // _yccImageROI2: viên thuốc màu hệ YCC
                #endregion

                #region ColorInrage viên thuốc màu cho ra _grayImage4
                if (_newdata.TabletColor.mau_hsv.low_s != 0)
                {
                    is_hsv = true;
                    is_ycc = false;
                    Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI2, _yccImageROI2, out _grayImage4,
                        _newdata.TabletColor.mau_hsv.H, _newdata.TabletColor.mau_hsv.S, _newdata.TabletColor.mau_hsv.V, 
                        _newdata.TabletColor.mau_hsv.low_h, _newdata.TabletColor.mau_hsv.low_s,_newdata.TabletColor.mau_hsv.low_v,
                        _newdata.TabletColor.mau_hsv.high_h, _newdata.TabletColor.mau_hsv.high_s, _newdata.TabletColor.mau_hsv.high_v);

                }
                else if (_newdata.TabletColor.mau_ycc.low_cr != 0)
                {
                    is_hsv = false;
                    is_ycc = true;
                    Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI2, _yccImageROI2, out _grayImage4,
                        _newdata.TabletColor.mau_ycc.Y, _newdata.TabletColor.mau_ycc.Cb, _newdata.TabletColor.mau_ycc.Cr,
                        _newdata.TabletColor.mau_ycc.low_y, _newdata.TabletColor.mau_ycc.low_cb, _newdata.TabletColor.mau_ycc.low_cr,
                        _newdata.TabletColor.mau_ycc.high_y, _newdata.TabletColor.mau_ycc.high_cb, _newdata.TabletColor.mau_ycc.high_cr);

                }
                #endregion

                #region lọc nhiễu cho viên thuốc trắng đen (_grayImage4)
                _grayImage4 = FilterImage.NoisyFilter(_grayImage4);     // trong này đã có erode và dilate rồi, 2 cái bên dưới chỉ là option thôi. cần thì làm thêm
                if (erodeimage)
                {
                    _grayImage4 = _grayImage4.Erode(Int32.Parse(txt_Erode.Text));
                }
                if (dilateimage)
                {
                    _grayImage4 = _grayImage4.Dilate(Int32.Parse(txt_Dilate.Text));
                }
                #endregion

                //CvInvoke.cvSetImageROI(_grayImage4, rect);              // rect là hcn đã được mở rộng
                //Image<Gray, Byte> _grayImage5 = _grayImage4.Copy();     // _grayImage5 = viên thuốc trắng đen
                //CvInvoke.cvResetImageROI(_grayImage4);
                // không cần tạo ta _grayImage5 nữa, bởi vì lúc này _grayImage5 và _grayImage4 là như nhau, đều là viên thuốc trắng đen

                Image<Gray, Byte> _grayImage6 = _hsvImageROI2.Convert<Gray, Byte>().PyrUp().PyrDown();

                #region check xem viên thuốc training hình dạng nào
                if (_newdata.TabletShape == "Round")
                {
                    shape_round = true;
                    shape_ellipse = false;
                    shape_square = false;
                    shape_capsule = false;
                }
                else if (_newdata.TabletShape == "Ellipse")
                {
                    shape_round = false;
                    shape_ellipse = true;
                    shape_square = false;
                    shape_capsule = false;
                }
                else if (_newdata.TabletShape == "Square")
                {
                    shape_round = false;
                    shape_ellipse = false;
                    shape_square = true;
                    shape_capsule = false;
                }
                else if (_newdata.TabletShape == "Capsule")
                {
                    shape_round = false;
                    shape_ellipse = false;
                    shape_square = false;
                    shape_capsule = true;
                }
                #endregion

                if (shape_round)
                {
                    #region
                    #region Check cirlce lần đầu
                    Process.CheckShape(_grayImage6, out true_shape, out true_size,
                        Int32.Parse(txt_tolerance_radius.Text), _newdata, thresholdcircle, Int32
                        .Parse(txt_ThresholdCircle.Text));
                    
                    Process.CheckArea(_grayImage4, out true_area, _newdata, Int32.Parse(txt_tolerance_area.Text));
                    #endregion

                    /* nếu biến kiểm tra diện tích = 0 thì xét xem viên thuốc đó có phải 2 màu không,
                     * nếu phải thì hiện giờ là màu thứ nhất có đúng không, nếu đúng thì ColorInrange 
                     * với màu thứ 2 (H1, S1, V1, range_h1, range_s1, range_v1, ...) sau đó  kiểm tra 
                     * thêm lần nữa như bên dưới đây */

                    if (true_area == 0)
                    {
                        if ((_newdata.is_twoColor == true) && (check_half == "1st"))
                        {
                            #region ColorInrage viên thuốc màu lần nữa
                            if (_newdata.TabletColor.mau_hsv.low_s != 0)
                            {
                                is_hsv = true;
                                is_ycc = false;
                                Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI2, _yccImageROI2, out _grayImage4,
                                    _newdata.TabletColor.mau_hsv.H1, _newdata.TabletColor.mau_hsv.S1, _newdata.TabletColor.mau_hsv.V1,
                                    _newdata.TabletColor.mau_hsv.low_h1, _newdata.TabletColor.mau_hsv.low_s1, _newdata.TabletColor.mau_hsv.low_v1,
                                    _newdata.TabletColor.mau_hsv.high_h1, _newdata.TabletColor.mau_hsv.high_s1, _newdata.TabletColor.mau_hsv.high_v1);

                            }
                            else if (_newdata.TabletColor.mau_ycc.low_cr != 0)
                            {
                                is_hsv = false;
                                is_ycc = true;
                                Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI2, _yccImageROI2, out _grayImage4,
                                    _newdata.TabletColor.mau_ycc.Y1, _newdata.TabletColor.mau_ycc.Cb1, _newdata.TabletColor.mau_ycc.Cr1,
                                    _newdata.TabletColor.mau_ycc.low_y1, _newdata.TabletColor.mau_ycc.low_cb1,_newdata.TabletColor.mau_ycc.low_cr1, 
                                    _newdata.TabletColor.mau_ycc.high_y1, _newdata.TabletColor.mau_ycc.high_cb1,_newdata.TabletColor.mau_ycc.high_cr1);

                            }
                            #endregion

                            #region lọc nhiễu cho viên thuốc trắng đen (_grayImage4)
                            _grayImage4 = FilterImage.NoisyFilter(_grayImage4);     // trong này đã có erode và dilate rồi, 2 cái bên dưới chỉ là option thôi. cần thì làm thêm
                            if (erodeimage)
                            {
                                _grayImage4 = _grayImage4.Erode(Int32.Parse(txt_Erode.Text));
                            }
                            if (dilateimage)
                            {
                                _grayImage4 = _grayImage4.Dilate(Int32.Parse(txt_Dilate.Text));
                            }
                            #endregion
                        }

                        #region check circle lần nữa
                        Process.CheckShape(_grayImage6, out true_shape, out true_size,
                             Int32.Parse(txt_tolerance_radius.Text), _newdata, thresholdcircle, Int32
                            .Parse(txt_ThresholdCircle.Text));

                        Process.CheckArea(_grayImage4, out true_area, _newdata, Int32.Parse(txt_tolerance_area.Text));
                        #endregion
                    }
                    #endregion
                }
                else if (shape_ellipse)
                {
                    #region
                    #region check_shape_ellipse lần đầu
                    Rectangle newrect;

                    // _grayImage6: ảnh xám của viên thuốc đó
                    // _grayImage5: ảnh trắng đen của viên thuốc đó (ảnh này có được sau khi dùng hàm colorInRange phát hiện)
                    Process.check_shape_ellipse(_grayImage6, _grayImage4, out true_shape, out true_size, out true_area,
                        Int32.Parse(txt_tolerance_radius.Text), Int32.Parse(txt_tolerance_area.Text), _newdata,
                        out newrect, Int32.Parse(txt_ThresholdCircle.Text));

                    #endregion

                    /* nếu biến kiểm tra diện tích = 0 thì xét xem viên thuốc đó có phải 2 màu không,
                     * nếu phải thì hiện giờ là màu thứ nhất có đúng không, nếu đúng thì ColorInrange 
                     * với màu thứ 2 (H1, S1, V1, range_h1, range_s1, range_v1, ...) sau đó  kiểm tra 
                     * thêm lần nữa như bên dưới đây */

                    if (true_area == 0)     
                    {
                        if ((_newdata.is_twoColor == true) && (check_half == "1st"))
                        {
                            #region ColorInrage viên thuốc màu lần nữa
                            if (_newdata.TabletColor.mau_hsv.low_s != 0)
                            {
                                is_hsv = true;
                                is_ycc = false;
                               Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI2, _yccImageROI2, out _grayImage4,
                                    _newdata.TabletColor.mau_hsv.H1, _newdata.TabletColor.mau_hsv.S1, _newdata.TabletColor.mau_hsv.V1,
                                    _newdata.TabletColor.mau_hsv.low_h1, _newdata.TabletColor.mau_hsv.low_s1, _newdata.TabletColor.mau_hsv.low_v1,
                                    _newdata.TabletColor.mau_hsv.high_h1, _newdata.TabletColor.mau_hsv.high_s1, _newdata.TabletColor.mau_hsv.high_v1);

                            }
                            else if (_newdata.TabletColor.mau_ycc.low_cr != 0)
                            {
                                is_hsv = false;
                                is_ycc = true;
                                 Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI2, _yccImageROI2, out _grayImage4,
                                    _newdata.TabletColor.mau_ycc.Y1, _newdata.TabletColor.mau_ycc.Cb1, _newdata.TabletColor.mau_ycc.Cr1,
                                    _newdata.TabletColor.mau_ycc.low_y1, _newdata.TabletColor.mau_ycc.low_cb1,_newdata.TabletColor.mau_ycc.low_cr1, 
                                    _newdata.TabletColor.mau_ycc.high_y1, _newdata.TabletColor.mau_ycc.high_cb1,_newdata.TabletColor.mau_ycc.high_cr1);

                            }
                            #endregion

                            #region lọc nhiễu cho viên thuốc trắng đen (_grayImage4)
                            _grayImage4 = FilterImage.NoisyFilter(_grayImage4);     // trong này đã có erode và dilate rồi, 2 cái bên dưới chỉ là option thôi. cần thì làm thêm
                            if (erodeimage)
                            {
                                _grayImage4 = _grayImage4.Erode(Int32.Parse(txt_Erode.Text));
                            }
                            if (dilateimage)
                            {
                                _grayImage4 = _grayImage4.Dilate(Int32.Parse(txt_Dilate.Text));
                            }
                            #endregion
                        }

                        #region check_shape_ellipse lần nữa
                        Process.check_shape_ellipse(_grayImage6, _grayImage4, out true_shape, out true_size, out true_area,
                             Int32.Parse(txt_tolerance_radius.Text), Int32.Parse(txt_tolerance_area.Text), _newdata,
                             out newrect, Int32.Parse(txt_ThresholdCircle.Text));
                        #endregion
                    }
                    #endregion
                }
                else if (shape_capsule)
                {
                    #region
                    #region check_shape_cappsule cho cả viên
                    Rectangle newrect;

                    // _grayImage6: ảnh xám của viên thuốc đó
                    // _grayImage5: ảnh trắng đen của viên thuốc đó (ảnh này có được sau khi dùng hàm colorInRange phát hiện)
                    Process.check_shape_capsule(_grayImage6, _grayImage4, out true_shape, out true_size, out true_area,
                        Int32.Parse(txt_tolerance_radius.Text), Int32.Parse(txt_tolerance_area.Text), _newdata,
                        out newrect, Int32.Parse(txt_ThresholdCircle.Text));
                    #endregion

                    if (true_area == 2)     
                    {
                        Rectangle rect_1st = new Rectangle(rect.X, rect.Y, rect.Width, rect.Height / 2);

                        Rectangle rect_2nd = new Rectangle(rect.X, (rect.Y + rect.Height / 2), rect.Width, rect.Height / 2);

                        #region copy nửa trên của của mỗi viên thuốc (_hsvImageROI2)
                        CvInvoke.cvSetImageROI(_hsvImage2, rect_1st);
                        Image<Hsv, Byte> _hsvImageROI3 = _hsvImage2.Copy();     // _hsvImageROI3 = nửa trên viên thuốc màu hệ HSV
                        CvInvoke.cvResetImageROI(_hsvImage2);

                        CvInvoke.cvSetImageROI(_yccImage2, rect_1st);
                        Image<Ycc, Byte> _yccImageROI3 = _yccImage2.Copy();
                        CvInvoke.cvResetImageROI(_yccImage2);                   // _yccImageROI3: nửa trên viên thuốc màu hệ YCC
                        #endregion

                        #region copy nửa dưới của của mỗi viên thuốc (_hsvImageROI2)
                        CvInvoke.cvSetImageROI(_hsvImage2, rect_2nd);
                        Image<Hsv, Byte> _hsvImageROI4 = _hsvImage2.Copy();     // _hsvImageROI4 = nửa trên viên thuốc màu hệ HSV
                        CvInvoke.cvResetImageROI(_hsvImage2);

                        CvInvoke.cvSetImageROI(_yccImage2, rect_2nd);
                        Image<Ycc, Byte> _yccImageROI4 = _yccImage2.Copy();
                        CvInvoke.cvResetImageROI(_yccImage2);                   // _yccImageROI4: nửa trên viên thuốc màu hệ YCC
                        #endregion

                        #region ColorInrage nửa trên với màu thứ 1
                        if (_newdata.TabletColor.mau_hsv.low_s1 != 0)
                        {
                            is_hsv = true;
                            is_ycc = false;
                            Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI3, _yccImageROI3, out _grayImage4,
                                 _newdata.TabletColor.mau_hsv.H1, _newdata.TabletColor.mau_hsv.S1, _newdata.TabletColor.mau_hsv.V1,
                                 _newdata.TabletColor.mau_hsv.low_h1, _newdata.TabletColor.mau_hsv.low_s1, _newdata.TabletColor.mau_hsv.low_v1,
                                 _newdata.TabletColor.mau_hsv.high_h1, _newdata.TabletColor.mau_hsv.high_s1, _newdata.TabletColor.mau_hsv.high_v1);

                        }
                        else if (_newdata.TabletColor.mau_ycc.low_cr1 != 0)
                        {
                            is_hsv = false;
                            is_ycc = true;
                            Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI3, _yccImageROI3, out _grayImage4,
                               _newdata.TabletColor.mau_ycc.Y1, _newdata.TabletColor.mau_ycc.Cb1, _newdata.TabletColor.mau_ycc.Cr1,
                               _newdata.TabletColor.mau_ycc.low_y1, _newdata.TabletColor.mau_ycc.low_cb1, _newdata.TabletColor.mau_ycc.low_cr1,
                               _newdata.TabletColor.mau_ycc.high_y1, _newdata.TabletColor.mau_ycc.high_cb1, _newdata.TabletColor.mau_ycc.high_cr1);

                        }
                        #endregion

                        #region lọc nhiễu cho nửa trên (_grayImage4)
                        _grayImage4 = FilterImage.NoisyFilter(_grayImage4);     // trong này đã có erode và dilate rồi, 2 cái bên dưới chỉ là option thôi. cần thì làm thêm
                        if (erodeimage)
                        {
                            _grayImage4 = _grayImage4.Erode(Int32.Parse(txt_Erode.Text));
                        }
                        if (dilateimage)
                        {
                            _grayImage4 = _grayImage4.Dilate(Int32.Parse(txt_Dilate.Text));
                        }
                        #endregion

                        // tính diện tích nửa trên
                        int half_area = _grayImage4.CountNonzero()[0];      

                        #region diện tích nửa trên có xấp xỉ 1/2 diện tích viên thuốc: ĐÚNG
                        if (half_area >= 0.35 * _newdata.TabletArea && half_area <= 0.7 * _newdata.TabletArea)       
                        {
                            #region ColorInrage nửa dưới với màu thứ 2
                            if (_newdata.TabletColor.mau_hsv.low_s1 != 0)
                            {
                                is_hsv = true;
                                is_ycc = false;
                                Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI4, _yccImageROI4, out _grayImage4,
                                     _newdata.TabletColor.mau_hsv.H2, _newdata.TabletColor.mau_hsv.S2, _newdata.TabletColor.mau_hsv.V2,
                                     _newdata.TabletColor.mau_hsv.low_h2, _newdata.TabletColor.mau_hsv.low_s2, _newdata.TabletColor.mau_hsv.low_v2,
                                     _newdata.TabletColor.mau_hsv.high_h2, _newdata.TabletColor.mau_hsv.high_s2, _newdata.TabletColor.mau_hsv.high_v2);

                            }
                            else if (_newdata.TabletColor.mau_ycc.low_cr1 != 0)
                            {
                                is_hsv = false;
                                is_ycc = true;
                                Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI4, _yccImageROI4, out _grayImage4,
                                   _newdata.TabletColor.mau_ycc.Y1, _newdata.TabletColor.mau_ycc.Cb1, _newdata.TabletColor.mau_ycc.Cr1,
                                   _newdata.TabletColor.mau_ycc.low_y1, _newdata.TabletColor.mau_ycc.low_cb1, _newdata.TabletColor.mau_ycc.low_cr1,
                                   _newdata.TabletColor.mau_ycc.high_y1, _newdata.TabletColor.mau_ycc.high_cb1, _newdata.TabletColor.mau_ycc.high_cr1);

                            }
                            #endregion

                            #region lọc nhiễu 
                            _grayImage4 = FilterImage.NoisyFilter(_grayImage4);     // trong này đã có erode và dilate rồi, 2 cái bên dưới chỉ là option thôi. cần thì làm thêm
                            if (erodeimage)
                            {
                                _grayImage4 = _grayImage4.Erode(Int32.Parse(txt_Erode.Text));
                            }
                            if (dilateimage)
                            {
                                _grayImage4 = _grayImage4.Dilate(Int32.Parse(txt_Dilate.Text));
                            }
                            #endregion

                            #region diện tích nửa dưới có xấp xỉ 1/2 diện tích viên thuốc
                            // tính diện tích nửa dưới
                            half_area = _grayImage4.CountNonzero()[0];
                            if (half_area >= 0.35 * _newdata.TabletArea && half_area <= 0.7 * _newdata.TabletArea)       // nếu diện tích nửa dưới xấp xỉ 1/2 viên thuốc
                            {
                                error = 0;      // viên thuốc không lỗi
                            }
                            else
                            {
                                error = 2;      // viên thuốc khác màu
                            }
                            #endregion
                        }
                        #endregion

                        #region diện tích nửa trên có xấp xỉ 1/2 diện tích viên thuốc: SAI
                        else 
                        {
                            #region ColorInrage nửa trên với màu thứ 2
                            if (_newdata.TabletColor.mau_hsv.low_s1 != 0)
                            {
                                is_hsv = true;
                                is_ycc = false;
                                Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI3, _yccImageROI3, out _grayImage4,
                                     _newdata.TabletColor.mau_hsv.H2, _newdata.TabletColor.mau_hsv.S2, _newdata.TabletColor.mau_hsv.V2,
                                     _newdata.TabletColor.mau_hsv.low_h2, _newdata.TabletColor.mau_hsv.low_s2, _newdata.TabletColor.mau_hsv.low_v2,
                                     _newdata.TabletColor.mau_hsv.high_h2, _newdata.TabletColor.mau_hsv.high_s2, _newdata.TabletColor.mau_hsv.high_v2);

                            }
                            else if (_newdata.TabletColor.mau_ycc.low_cr1 != 0)
                            {
                                is_hsv = false;
                                is_ycc = true;
                                Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI3, _yccImageROI3, out _grayImage4,
                                   _newdata.TabletColor.mau_ycc.Y2, _newdata.TabletColor.mau_ycc.Cb2, _newdata.TabletColor.mau_ycc.Cr2,
                                   _newdata.TabletColor.mau_ycc.low_y2, _newdata.TabletColor.mau_ycc.low_cb2, _newdata.TabletColor.mau_ycc.low_cr2,
                                   _newdata.TabletColor.mau_ycc.high_y2, _newdata.TabletColor.mau_ycc.high_cb2, _newdata.TabletColor.mau_ycc.high_cr2);

                            }
                            #endregion

                            #region lọc nhiễu
                            _grayImage4 = FilterImage.NoisyFilter(_grayImage4);     // trong này đã có erode và dilate rồi, 2 cái bên dưới chỉ là option thôi. cần thì làm thêm
                            if (erodeimage)
                            {
                                _grayImage4 = _grayImage4.Erode(Int32.Parse(txt_Erode.Text));
                            }
                            if (dilateimage)
                            {
                                _grayImage4 = _grayImage4.Dilate(Int32.Parse(txt_Dilate.Text));
                            }
                            #endregion

                            // tính diện tích nửa trên lại lần nữa
                            half_area = _grayImage4.CountNonzero()[0];

                            #region diện tích nửa trên có xấp xỉ 1/2 diện tích viên thuốc: ĐÚNG
                            if (half_area >= 0.35 * _newdata.TabletArea && half_area <= 0.7 * _newdata.TabletArea)
                            {
                                #region ColorInrage nửa dưới với màu thứ 1
                                if (_newdata.TabletColor.mau_hsv.low_s1 != 0)
                                {
                                    is_hsv = true;
                                    is_ycc = false;
                                    Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI4, _yccImageROI4, out _grayImage4,
                                         _newdata.TabletColor.mau_hsv.H1, _newdata.TabletColor.mau_hsv.S1, _newdata.TabletColor.mau_hsv.V1,
                                         _newdata.TabletColor.mau_hsv.low_h1, _newdata.TabletColor.mau_hsv.low_s1, _newdata.TabletColor.mau_hsv.low_v1,
                                         _newdata.TabletColor.mau_hsv.high_h1, _newdata.TabletColor.mau_hsv.high_s1, _newdata.TabletColor.mau_hsv.high_v1);

                                }
                                else if (_newdata.TabletColor.mau_ycc.low_cr1 != 0)
                                {
                                    is_hsv = false;
                                    is_ycc = true;
                                    Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI4, _yccImageROI4, out _grayImage4,
                                       _newdata.TabletColor.mau_ycc.Y1, _newdata.TabletColor.mau_ycc.Cb1, _newdata.TabletColor.mau_ycc.Cr1,
                                       _newdata.TabletColor.mau_ycc.low_y1, _newdata.TabletColor.mau_ycc.low_cb1, _newdata.TabletColor.mau_ycc.low_cr1,
                                       _newdata.TabletColor.mau_ycc.high_y1, _newdata.TabletColor.mau_ycc.high_cb1, _newdata.TabletColor.mau_ycc.high_cr1);

                                }
                                #endregion

                                // tính diện tích nửa dưới
                                half_area = _grayImage4.CountNonzero()[0];
                                if (half_area >= 0.35 * _newdata.TabletArea && half_area <= 0.7 * _newdata.TabletArea)
                                {
                                    error = 0;      // viên thuốc không lỗi
                                }
                                else
                                {
                                    error = 2;      // viên thuốc khác màu
                                }
                            }
                            #endregion

                            #region diện tích nửa trên có xấp xỉ 1/2 diện tích viên thuốc: SAI
                            else
                            {
                                error = 2;      // viên thuốc khác màu
                            }
                            #endregion

                        }
                        #endregion

                    }
                    else        // 
                    {
                        if (true_area==0)
                        {
                            error = 5;  // mã lỗi không có thuốc
                        }
                        else if (true_area==1)
                        {
                            error = 2;  // mã lỗi viên thuốc khác màu
                        }
                    }
                    #endregion
                }
                else if (shape_square)
                {
                    #region
                    #region check_shape_square lần đầu
                    Rectangle newrect;
                    Process.check_shape_square(_grayImage6, _grayImage4, out true_shape, out true_size, out true_area,
                        Int32.Parse(txt_tolerance_radius.Text), Int32.Parse(txt_tolerance_area.Text), _newdata,
                        out newrect, Int32.Parse(txt_ThresholdCircle.Text));
                    #endregion

                    /* nếu biến kiểm tra diện tích = 0 thì xét xem viên thuốc đó có phải 2 màu không,
                     * nếu phải thì hiện giờ là màu thứ nhất có đúng không, nếu đúng thì ColorInrange 
                     * với màu thứ 2 (H1, S1, V1, range_h1, range_s1, range_v1, ...) sau đó  kiểm tra 
                     * thêm lần nữa như bên dưới đây */

                    if (true_area==0)
                    {
                        if ((_newdata.is_twoColor == true) && (check_half == "1st"))
                        {
                            #region ColorInrage viên thuốc màu lần nữa
                            if (_newdata.TabletColor.mau_hsv.low_s != 0)
                            {
                                is_hsv = true;
                                is_ycc = false;
                               Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI2, _yccImageROI2, out _grayImage4,
                                    _newdata.TabletColor.mau_hsv.H1, _newdata.TabletColor.mau_hsv.S1, _newdata.TabletColor.mau_hsv.V1,
                                    _newdata.TabletColor.mau_hsv.low_h1, _newdata.TabletColor.mau_hsv.low_s1, _newdata.TabletColor.mau_hsv.low_v1,
                                    _newdata.TabletColor.mau_hsv.high_h1, _newdata.TabletColor.mau_hsv.high_s1, _newdata.TabletColor.mau_hsv.high_v1);

                            }
                            else if (_newdata.TabletColor.mau_ycc.low_cr != 0)
                            {
                                is_hsv = false;
                                is_ycc = true;
                                Process.ColorInrange(is_hsv, is_ycc, _hsvImageROI2, _yccImageROI2, out _grayImage4,
                                    _newdata.TabletColor.mau_ycc.Y1, _newdata.TabletColor.mau_ycc.Cb1, _newdata.TabletColor.mau_ycc.Cr1,
                                    _newdata.TabletColor.mau_ycc.low_y1, _newdata.TabletColor.mau_ycc.low_cb1,_newdata.TabletColor.mau_ycc.low_cr1, 
                                    _newdata.TabletColor.mau_ycc.high_y1, _newdata.TabletColor.mau_ycc.high_cb1,_newdata.TabletColor.mau_ycc.high_cr1);

                            }
                            #endregion

                            #region lọc nhiễu cho viên thuốc trắng đen (_grayImage4)
                            _grayImage4 = FilterImage.NoisyFilter(_grayImage4);     // trong này đã có erode và dilate rồi, 2 cái bên dưới chỉ là option thôi. cần thì làm thêm
                            if (erodeimage)
                            {
                                _grayImage4 = _grayImage4.Erode(Int32.Parse(txt_Erode.Text));
                            }
                            if (dilateimage)
                            {
                                _grayImage4 = _grayImage4.Dilate(Int32.Parse(txt_Dilate.Text));
                            }
                            #endregion

                            #region check_shape_square lần nữa
                            Process.check_shape_square(_grayImage6, _grayImage4, out true_shape, out true_size, out true_area,
                                Int32.Parse(txt_tolerance_radius.Text), Int32.Parse(txt_tolerance_area.Text), _newdata,
                                out newrect, Int32.Parse(txt_ThresholdCircle.Text));
                            #endregion
                        }
                    }
                    #endregion
                }


                #region kiểm tra xem viên thuốc bị lỗi gì và vẽ lỗi cho viên thuốc đó

                if (shape_capsule == false)
                {
                    ErrorAndResult.CheckError(i, true_shape, true_area, true_size, out error, out result);
                }
                if (error != 0)
                {
                    mangcu = ErrorAndResult.CheckBlister(i, error, mangcu, _newdata.NumberOfTablet.SoVienThuoc);

                }
                // vẽ khung cho từng viên thuốc, nếu bị lỗi thì vẽ màu đỏ, không lỗi vẽ màu đen
                ErrorAndResult.DrawError(error, i, _hsvImage2, rect, _newdata, showerror);
                #endregion

            }
            #endregion

            imageBox3.Image = _hsvImage2;       // _hsvImage2 lúc bây giờ là ảnh đã được vẽ tất cả các lỗi
            _binaryImage = _grayImage4;
            ww.Stop();
            if (LiveMode_radio.Checked)
            {
                toolStripStatusLabel1.Text = "Processing Time: " + ww.ElapsedMilliseconds + " ms";
            }
            else
            {
                toolStripStatusLabel1.Text = "Processing Time: " + ww.ElapsedMilliseconds + " ms ; File Name: " + filesname[index];
            }
            //   MessageBox.Show("" + ww.ElapsedMilliseconds);
            Sendtodatabase(mangcu);
            return;

        }

        private void btn_Inspection_Click(object sender, EventArgs e)
        {
            pause = !pause;

            if (pause)
            {
                timer2.Stop();
                btn_Inspection.Text = "Inspection";
            }
            else
            {

                timer2.Interval = Int32.Parse(txt_Interval.Text);
                timer2.Enabled = true;
                btn_Inspection.Text = "Pause";
            }

            /*   for (int m = 1; m <= 6; m++)
             {
                 for (int n = 1; n <= 6; n++)
                 {
                     if (mangcu[m, n] != 0)
                     {
                         if (txt_Result1.Text == " ")
                         {
                             txt_Result1.Text = "vi so " + m + " bi loi " + n + ", " + mangcu[m, n] + " lan";
                         }
                         else if (txt_Result2.Text == " ")
                         {
                             txt_Result2.Text = "vi so " + m + " bi loi " + n + "," + mangcu[m, n] + " lan";
                         }
                         else if (txt_Result3.Text == " ")
                         {
                             txt_Result3.Text = "vi so " + m + " bi loi " + n + ", " + mangcu[m, n] + " lan";
                         }
                         else if (txt_Result4.Text == " ")
                         {
                             txt_Result4.Text = "vi so " + m + " bi loi " + n + ", " + mangcu[m, n] + " lan";
                         }
                         else if (txt_Result5.Text == " ")
                         {
                             txt_Result5.Text = "vi so " + m + " bi loi " + n + ", " + mangcu[m, n] + " lan";
                         }
                         else if (txt_Result6.Text == " ")
                         {
                             txt_Result6.Text = "vi so " + m + " bi loi " + n + ", " + mangcu[m, n] + " lan";
                         }
                     }
                 }
             }*/

        }

        private void Sendtodatabase(int[,] inspection_result)
        {
            inspection_count++;
            blister_error_sum[0] = 0;
            for (int i = 1; i <= 6; i++)
            {
                blister_error[i] = 0;
            }

            for (int i = 1; i <= 6; i++)
            {
                for (int j = 1; j <= 6; j++)
                {
                    if (inspection_result[i, j] != 0)
                    {
                        blister_error[i] = j;

                    }
                }
            }
            // chua lam cho truong hop 1 vi bi 2 loi khac nhau
            for (int i = 1; i <= 6; i++)
            {
                if (blister_error[i] != 0)
                {
                    blister_error_sum[i]++;
                }
            }
            for (int i = 1; i <= 6; i++)
            {
                blister_error_sum[0] += blister_error_sum[i];
            }
            for (int j = 1; j <= 6; j++)
            {
                for (int i = 1; i <= 6; i++)
                {
                    if (inspection_result[i, j] != 0)
                    {
                        type_error_sum[j] += inspection_result[i, j];
                    }
                }
            }
            //hien thi result
            sum_blis1.Text = Convert.ToString(blister_error_sum[1]);
            sum_blis2.Text = Convert.ToString(blister_error_sum[2]);
            sum_blis3.Text = Convert.ToString(blister_error_sum[3]);
            sum_blis4.Text = Convert.ToString(blister_error_sum[4]);
            sum_blis5.Text = Convert.ToString(blister_error_sum[5]);
            sum_blis6.Text = Convert.ToString(blister_error_sum[6]);
            sum_total.Text = Convert.ToString(blister_error_sum[0]);
            sum_type1.Text = Convert.ToString(type_error_sum[1]);
            sum_type2.Text = Convert.ToString(type_error_sum[2]);
            sum_type3.Text = Convert.ToString(type_error_sum[3]);
            sum_type4.Text = Convert.ToString(type_error_sum[4]);
            sum_type5.Text = Convert.ToString(type_error_sum[5]);
            sum_type6.Text = Convert.ToString(type_error_sum[6]);
            if (blister_error_sum[0] > 10)
            {
                warningBox1.Text = "<b> Warning : Blisters have too many error ! </b>  ";
            }
            //gui du lieu xuong database
            //DatabaseManage.AddNewData(context, inspection_count, blister_error[1], blister_error[2], blister_error[3],
            //    blister_error[4], blister_error[5], blister_error[6]);
            // UART

            if (LiveMode_radio.Checked)
            {
                guichuoiquaUart();
            }
        }

        private void btn_start_live_Click(object sender, EventArgs e)
        {
            btn_start_live.Enabled = false;
            btn_stop.Enabled = true;
            _capture = new Capture();
            _capture.SetCaptureProperty(CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, frame_width);
            _capture.SetCaptureProperty(CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, frame_height);
            //Application.Idle += new EventHandler(showcam); dùng camera công nghiệp nên không dùng dòng này
            timer1.Enabled = true;


        }



        private void btn_stop_Click(object sender, EventArgs e)
        {
            btn_start_live.Enabled = true;
            //Application.Idle -= showcam; dùng camera công nghiệp nên không dùng dòng này
            btn_stop.Enabled = false;
            datareceive = false;
        }

        private void buttonX1_Click(object sender, EventArgs e)
        {
            Stopwatch newStopwatch = new Stopwatch();
            newStopwatch.Start();

            imageBox3.Refresh();
            //Application.Idle -= showcam; dùng camera công nghiệp nên không dùng dòng này
            Luuhinh();
            newStopwatch.Stop();
            toolStripStatusLabel1.Text = "Processing Time: " + newStopwatch.ElapsedMilliseconds + " ms";
            //Application.Idle += new EventHandler(showcam); dùng camera công nghiệp nên không dùng dòng này
        }

        private void Luuhinh()
        {
            if (autosave)
            {
                if (Directory.Exists(new FileInfo(_newdata.BlisterImagePath).Directory + "\\" + txt_AutoSave.Text) == false)
                {
                    Directory.CreateDirectory(new FileInfo(_newdata.BlisterImagePath).Directory + "\\" + txt_AutoSave.Text);
                }
                _bgrImage1.Save(new FileInfo(_newdata.BlisterImagePath).Directory + "\\" + txt_AutoSave.Text + "\\" + DateTime.Now.Day + "_" + DateTime.Now.Month + "_" + DateTime.Now.Year + "_" + DateTime.Now.TimeOfDay.Hours + "_" + DateTime.Now.TimeOfDay.Minutes + "_" + DateTime.Now.TimeOfDay.Seconds + "_" + DateTime.Now.TimeOfDay.Milliseconds + ".jpg");
            }
            _hsvImage2 = _bgrImage1.Convert<Hsv, Byte>();
            _yccImage2 = _bgrImage1.Convert<Ycc, Byte>();
            inspection_program();
        }

        private void btn_bluethemes_Click(object sender, EventArgs e)
        {
            styleManager1.ManagerStyle = eStyle.Office2007Blue;
            RibbonPredefinedColorSchemes.ChangeOffice2007ColorTable(eOffice2007ColorScheme.Blue);
        }

        private void btn_blackthemes_Click(object sender, EventArgs e)
        {
            styleManager1.ManagerStyle = eStyle.Office2007Black;
            RibbonPredefinedColorSchemes.ChangeOffice2007ColorTable(eOffice2007ColorScheme.Black);
        }

        private void btn_silverthemes_Click(object sender, EventArgs e)
        {
            styleManager1.ManagerStyle = eStyle.Office2007Silver;
            RibbonPredefinedColorSchemes.ChangeOffice2007ColorTable(eOffice2007ColorScheme.Silver);
        }

        private void BKBIS_Load(object sender, EventArgs e)
        {

        }

        private void BKBIS_Closing(object sender, EventArgs e)
        {

        }

        private void LiveMode_radio_CheckedChanged(object sender, EventArgs e)
        {
            if (LiveMode_radio.Checked == true)
            {
                btn_GetImage.Enabled = false;
                btn_Inspection.Enabled = false;
                btn_start_live.Enabled = true;
                btn_stop.Enabled = true;
                btn_simulation.Enabled = true;
                disablelight = !disablelight;
            }
            else
            {
                btn_GetImage.Enabled = true;
                btn_Inspection.Enabled = true;
                btn_start_live.Enabled = false;
                btn_stop.Enabled = false;
                btn_simulation.Enabled = false;
                disablelight = !disablelight;
            }

        }

      

        private void btn_cameraProperties_Click(object sender, EventArgs e)
        {
            ICImagingControl icImagingControl1 = new ICImagingControl();
            icImagingControl1.ShowPropertyDialog();
            //Get back camera parameter
            //int a = VCDProp.RangeValue[VCDIDs.VCDID_Gain];
        }




        private void frontlight_adjust(int bright)
        {
            string ledbright = "9";
            sending_flag = 1;
            ledbright += Convert.ToString(bright);
            string buffer1 = ledbright + 'e';
            //Com.Write(buffer1);   // nhớ bỏ comment khi chạy trên máy tính công nghiệp
            sending_flag = 0;
        }

        private void backlight_adjust(int bright1)
        {
            string ledbright = "7";
            sending_flag = 1;
            ledbright += Convert.ToString(bright1);
            string buffer1 = ledbright + 'e';
            //Com.Write(buffer1);       // nhớ bỏ comment khi chạy trên máy tính công nghiệp
            sending_flag = 0;
        }




        private void btn_ViewBinaryImage_Click(object sender, EventArgs e)
        {
            viewbinary = !viewbinary;
            if (viewbinary)
            {
                imageBox3.Image = _binaryImage;
                btn_ViewBinaryImage.Text = "View Result Image";
            }
            else
            {
                imageBox3.Image = _hsvImage2;
                btn_ViewBinaryImage.Text = "View Binary Image";
            }
        }
        private void simulate_timer(object sender, EventArgs e)
        {
            if (test1 == true)
            {
                Stopwatch newStopwatch = new Stopwatch();
                newStopwatch.Start();
                test1 = false;
                imageBox3.Refresh();
                //Application.Idle -= showcam; dùng camera công nghiệp nên không dùng dòng này
                Luuhinh();
                newStopwatch.Stop();
                toolStripStatusLabel1.Text = "Processing Time: " + newStopwatch.ElapsedMilliseconds + " ms";
                //Application.Idle += new EventHandler(showcam); dùng camera công nghiệp nên không dùng dòng này

            }



        }



        private void lbConnect_Click(object sender, EventArgs e)
        {

        }

        private void btn_showerror_Click(object sender, EventArgs e)
        {
            showerror = !showerror;
            if (showerror)
            {
                btn_showerror.Text = "Do Not Show Error";
            }
            else
            {
                btn_showerror.Text = "Show Error";
            }
        }



        private void btn_AutoSave_Click(object sender, EventArgs e)
        {
            autosave = !autosave;
            if (autosave)
            {
                btn_AutoSave.Text = " Do Not Auto Save";
            }
            else
            {
                btn_AutoSave.Text = "Auto Save To Folder";
            }
        }

        private void timer2_tick(object sender, EventArgs e)
        {
            _bgrImage2 = new Image<Bgr, Byte>(filesname[index]);
            _hsvImage2 = new Image<Hsv, Byte>(filesname[index]);
            _yccImage2 = new Image<Ycc, Byte>(filesname[index]);
            imageBox3.Image = _hsvImage2;
            inspection_program();
            index++;
            if (index >= filesname.Length)
            {
                timer2.Enabled = false;
                btn_Inspection.Text = "Inspection";
                pause = !pause;
                MessageBox.Show("Finish");
            }
        }

        private void btn_Erode_Click_1(object sender, EventArgs e)
        {
            erodeimage = !erodeimage;
            if (erodeimage)
            {
                btn_Erode.Text = "Disable Erosion";
            }
            else
            {

                btn_Erode.Text = " Enable Erosion";
            }
        }

        private void btn_Dilate_Click_1(object sender, EventArgs e)
        {
            dilateimage = !dilateimage;
            if (dilateimage)
            {
                btn_Dilate.Text = "Disable Delation";
            }
            else
            {

                btn_Dilate.Text = " Enable Delation";
            }
        }

        private void btn_ThresholdCircle_Click_1(object sender, EventArgs e)
        {
            thresholdcircle = !thresholdcircle;
            if (thresholdcircle)
            {
                btn_ThresholdCircle.Text = " Disable Threshold";
            }
            else
            {
                btn_ThresholdCircle.Text = " Disable ThresholdCircle";
            }
        }

        private void slide_frontlight_ValueChanged_1(object sender, EventArgs e)
        {
            numeric_Frontbright.Value = (Decimal)slide_frontlight.Value;
            frontlight_adjust(slide_frontlight.Value);
        }

        private void slide_backlight_ValueChanged_1(object sender, EventArgs e)
        {
            numeric_backbright.Value = (Decimal)slide_backlight.Value;
            backlight_adjust(slide_backlight.Value);
        }

        private void numeric_Frontbright_ValueChanged(object sender, EventArgs e)
        {

            slide_frontlight.Value = (int)numeric_Frontbright.Value;
            frontlight_adjust((int)numeric_Frontbright.Value);
        }

        private void numeric_backbright_ValueChanged_1(object sender, EventArgs e)
        {
            slide_backlight.Value = (int)numeric_backbright.Value;
            backlight_adjust((int)numeric_backbright.Value);
        }

        private void numeric_h_UpDown(object sender, EventArgs e)
        {
            trBar_h.Value = (int)numeric_h.Value;
        }

        private void numeric_s_UpDown(object sender, EventArgs e)
        {
            trBar_s.Value = (int)numeric_s.Value;
        }

        private void numeric_v_UpDown(object sender, EventArgs e)
        {
            trBar_v.Value = (int)numeric_v.Value;
        }

        private void numeric_h_low_ValueChanged(object sender, EventArgs e)
        {
            trBar_h_low.Value = (int)numeric_h_low.Value;
        }

        private void numeric_s_low_ValueChanged(object sender, EventArgs e)
        {
            trBar_s_low.Value = (int)numeric_s_low.Value;
        }

        private void numeric_v_low_ValueChanged(object sender, EventArgs e)
        {
            trBar_v_low.Value = (int)numeric_v_low.Value;
        }


        //private void Ra_Lowres_CheckedChanged_1(object sender, EventArgs e)
        //{
        //    if (Ra_Lowres.Checked)
        //    {
        //        lowres = true;
        //        frame_width = 1280;
        //        frame_height = 960;
        //        imageBox1.Width = 640;
        //        imageBox1.Height = 480;
        //        imageBox2.Width = 640;
        //        imageBox2.Height = 480;
        //        imageBox3.Width = 640;
        //        imageBox3.Height = 480;
        //        imageBox4.Width = 640;
        //        imageBox4.Height = 480;
        //    }
        //    else
        //    {
        //        lowres = false;

        //    }
        //}


        //private void Ra_Highres_CheckedChanged(object sender, EventArgs e)
        //{
        //    if (Ra_Highres.Checked)
        //    {
        //        highres = true;
        //        frame_width = 2592;
        //        frame_height = 1944;
        //        imageBox1.Width = 648;
        //        imageBox1.Height = 486;
        //        imageBox2.Width = 648;
        //        imageBox2.Height = 486;
        //        imageBox3.Width = 648;
        //        imageBox3.Height = 486;
        //        imageBox4.Width = 648;
        //        imageBox4.Height = 486;
        //    }
        //    else
        //    {
        //        highres = false;
        //    }
        //}

        private void radio_Frontlight_CheckedChanged_1(object sender, EventArgs e)
        {
            slide_frontlight.Enabled = true;
            slide_backlight.Enabled = false;
            slide_backlight.Value = 10;
            backlight_adjust(10);
        }

        private void radio_Backlight_CheckedChanged_1(object sender, EventArgs e)
        {
            slide_frontlight.Enabled = false;
            slide_backlight.Enabled = true;
            slide_frontlight.Value = 10;
            frontlight_adjust(10);
        }

        private void radio_Bothlight_CheckedChanged_1(object sender, EventArgs e)
        {
            slide_frontlight.Enabled = true;
            slide_backlight.Enabled = true;
        }

        private void btn_LoadFile_Click(object sender, EventArgs e)
        {
            #region reset nút "colorInrange"
            colorinrange = false;
            btn_ColorInrange.Text = "Color Inrange";
            #endregion

            string temp_path = "";
            if (_pathImage != "")
            {
                temp_path = _pathImage;
            }
            _pathImage = "";
            _pathImage = newload.LoadImageFromFile("Load Image To Training", "jpg");
            if (_pathImage == "")
            {
                if (temp_path != "")
                {
                    _pathImage = temp_path;
                }
                return;
            }
            else
            {
                _bgrImage = new Image<Bgr, Byte>(_pathImage);
                _bgrImage = _bgrImage.Resize(1280, 960, INTER.CV_INTER_LINEAR, true);   // resize file ảnh thành 1280 x 960
                //_hsvImage = new Image<Hsv, Byte>(_pathImage);
                //_yccImage = new Image<Ycc, Byte>(_pathImage);
                _hsvImage = _bgrImage.Convert<Hsv, Byte>();
                _yccImage = _bgrImage.Convert<Ycc, Byte>();

                imageBox1.Image = _hsvImage;
                ratio_resize = _hsvImage.Width / imageBox1.Width;
                _hsvImage1 = _hsvImage.Copy();
                _yccImage1 = _yccImage.Copy();
                _grayImage2 = new Image<Gray, Byte>(_hsvImage1.Width, _hsvImage1.Height);
                txtBox_Path.Text = _pathImage;
            }
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            lbl_threshold.Text = trackBar1.Value.ToString();
            Image<Gray, Byte> gray = _hsvImageROI.Convert<Gray, Byte>();

            int intensity1 = (int)gray[gray.Height - 1, gray.Width - 1].Intensity;
            int intensity2 = (int)gray[gray.Height - 1, 1].Intensity;
            int intensity3 = (int)gray[1, gray.Width - 1].Intensity;
            int intensity4 = (int)gray[1, 1].Intensity;
            int average_intensity;
            if (Math.Max(intensity1, Math.Max(intensity2, Math.Max(intensity3, intensity4))) <
                Math.Min(intensity1, Math.Min(intensity2, Math.Min(intensity3, intensity4))) + 30)
            {
                average_intensity = (intensity1 + intensity2 + intensity3 + intensity4) / 4;
            }
            else
            {
                average_intensity = (Math.Max(intensity1, Math.Max(intensity2, Math.Min(intensity3, intensity4))) +
                                     Math.Max(intensity1, Math.Min(intensity2, Math.Min(intensity3, intensity4)))) / 2;
            }
            // dùng hàm AbsDiff làm n?i biên
            Image<Gray, Byte> gray1 = gray.AbsDiff(new Gray(average_intensity));
            //Image<Gray, Byte> gray1 = gray.AbsDiff(new Gray(247));

            // dùng hàm ThresholdBinary l?y ngu?ng chuy?n sang nh? phân
            Image<Gray, Byte> gray2 = gray1.ThresholdBinary(new Gray(trackBar1.Value), new Gray(255));

            Image<Hsv, Byte> copy_hsvImageROI = _hsvImageROI.Copy();
            imageBox5.Image = gray2;
            imageBox6.Image = copy_hsvImageROI;

            
            #region Extracting the Contours
            using (MemStorage storage = new MemStorage())
            {

                for (Contour<Point> contours = gray2.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_TREE, storage); contours != null; contours = contours.HNext)
                {

                    Contour<Point> currentContour = contours.ApproxPoly(contours.Perimeter * 0.05, storage);

                    CvInvoke.cvDrawContours(copy_hsvImageROI, currentContour, new MCvScalar(255), new MCvScalar(255), -1, 1, Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, new Point(0, 0));

                    //copy_hsvImageROI.Draw(contours.BoundingRectangle, new Hsv(100, 173, 200), 2);
                }

            }
            #endregion
            imageBox6.Image = copy_hsvImageROI;
        }

        private void exitThreshold_Click(object sender, EventArgs e)
        {
            imageBox5.Image = _hsvImage;
        }

        private void chk_twoColor_CheckedChanged(object sender, EventArgs e)
        {
            if (chk_twoColor.Checked)
            {
                data.is_twoColor = true;
                RaBtn_1stHalf.Enabled = true;
                RaBtn_2ndHalf.Enabled = true;
            }
            else
            {
                data.is_twoColor = false;
                RaBtn_1stHalf.Enabled = false;
                RaBtn_2ndHalf.Enabled = false;
            }
        }

        private void chk_Enable_CheckedChanged(object sender, EventArgs e)
        {
            data.Brightness = new Light();
            data.TabletColor=new MauSac();
            data.TabletColor.mau_hsv=new MauHSV();
            data.TabletColor.mau_ycc= new MauYCC();
            data.NumberOfTablet = new So_Luong();

        }

        private void trBar_h_low_ValueChanged(object sender, EventArgs e)
        {
            Process.ColorInrange(is_hsv, is_ycc, _hsvImage1, _yccImage1, out _grayImage2, average[0], average[1],
                average[2], trBar_h_low.Value, trBar_s_low.Value, trBar_v_low.Value, trBar_h.Value, trBar_s.Value, trBar_v.Value);
            numeric_h_low.Value = trBar_h_low.Value;
            trBar_h_low.Text = (trBar_h_low.Value - average[0]).ToString();
            _grayImage2 = FilterImage.NoisyFilter(_grayImage2);
            if (erodeimage)
            {
                _grayImage2 = _grayImage2.Erode(Int32.Parse(txt_Erode.Text));
            }
            if (dilateimage)
            {
                _grayImage2 = _grayImage2.Dilate(Int32.Parse(txt_Dilate.Text));
            }
            if (colorinrange == true)
            {
                imageBox1.Image = _grayImage2;
            }
        }

        private void trBar_s_low_ValueChanged(object sender, EventArgs e)
        {
            Process.ColorInrange(is_hsv, is_ycc, _hsvImage1, _yccImage1, out _grayImage2, average[0], average[1],
               average[2], trBar_h_low.Value, trBar_s_low.Value, trBar_v_low.Value, trBar_h.Value, trBar_s.Value, trBar_v.Value);
            numeric_s_low.Value = trBar_s_low.Value;
            trBar_s_low.Text = (trBar_s_low.Value - average[1]).ToString();
            _grayImage2 = FilterImage.NoisyFilter(_grayImage2);
            if (erodeimage)
            {
                _grayImage2 = _grayImage2.Erode(Int32.Parse(txt_Erode.Text));
            }
            if (dilateimage)
            {
                _grayImage2 = _grayImage2.Dilate(Int32.Parse(txt_Dilate.Text));
            }
            if (colorinrange == true)
            {
                imageBox1.Image = _grayImage2;
            }
        }

        private void trBar_v_low_ValueChanged(object sender, EventArgs e)
        {
            Process.ColorInrange(is_hsv, is_ycc, _hsvImage1, _yccImage1, out _grayImage2, average[0], average[1],
               average[2], trBar_h_low.Value, trBar_s_low.Value, trBar_v_low.Value, trBar_h.Value, trBar_s.Value, trBar_v.Value);
            numeric_v_low.Value = trBar_v_low.Value;
            trBar_v_low.Text = (trBar_v_low.Value - average[2]).ToString();
            _grayImage2 = FilterImage.NoisyFilter(_grayImage2);
            if (erodeimage)
            {
                _grayImage2 = _grayImage2.Erode(Int32.Parse(txt_Erode.Text));
            }
            if (dilateimage)
            {
                _grayImage2 = _grayImage2.Dilate(Int32.Parse(txt_Dilate.Text));
            }
            if (colorinrange==true)
            {
               imageBox1.Image = _grayImage2;
            }

        }

        private void btn_ClearContour_Click(object sender, EventArgs e)
        {
            #region reset nút "colorInrange"
            colorinrange = false;
            btn_ColorInrange.Text = "Color Inrange";
            #endregion

            _hsvImage1 = _hsvImage.Copy();
            imageBox1.Image = _hsvImage1;
        }

        private void btn_ColorInrange_Click(object sender, EventArgs e)
        {
            colorinrange = !(colorinrange);
            if (colorinrange == false)
            {
                btn_ColorInrange.Text = "Color Inrange";
                imageBox1.Image = _hsvImage1;
            }
            else
            {
                btn_ColorInrange.Text = "Un Color Inrange";
                imageBox1.Image = _grayImage2;
            }
        }

        private void icImagingControl1_Load(object sender, EventArgs e)
        {

        }


        #region xử lý sự kiện mất kết nối với thiết bị
        private delegate void DeviceLostDelegate();

        private void DeviceLost()
        {
            icImagingControl1.Device = "";
            MessageBox.Show("Device Lost!");
        }

        private void icImagingControl1_DeviceLost(object sender, ICImagingControl.DeviceLostEventArgs e)
        {
            BeginInvoke(new DeviceLostDelegate(ref DeviceLost));

        }

        #endregion

        private void btn_device_Click(object sender, EventArgs e)
        {
            if (icImagingControl1.DeviceValid)
            {

                if (icImagingControl1.LiveVideoRunning)
                {
                    icImagingControl1.LiveStop();
                    btn_LiveImage.Text = "Start Live";
                }
            }
            icImagingControl1.ShowDeviceSettingsDialog();
            //if (icImagingControl1.DeviceValid)
            //{
            //    icImagingControl1.SaveDeviceStateToFile("device.xml");
            //}
            // Update button states
            btn_LiveImage.Enabled = icImagingControl1.DeviceValid;
            btn_Capture.Enabled = icImagingControl1.DeviceValid;
            btn_properties.Enabled = icImagingControl1.DeviceValid;
            btn_defaultProperties.Enabled = icImagingControl1.DeviceValid;
            btn_lastUsedProperties.Enabled = icImagingControl1.DeviceValid;
            btn_saveProperties.Enabled = icImagingControl1.DeviceValid;
            btn_loadProperties.Enabled = icImagingControl1.DeviceValid;
            
            
        }

        private void btn_properties_Click(object sender, EventArgs e)
        {
            if (icImagingControl1.DeviceValid)
            {
                icImagingControl1.ShowPropertyDialog();
                //if (icImagingControl1.DeviceValid)
                //{
                //    icImagingControl1.SaveDeviceStateToFile("device.xml");
                //}

            }
        }

        private void btn_defaultProperties_Click(object sender, EventArgs e)
        {
            if (icImagingControl1.LiveVideoRunning)
            {
                icImagingControl1.LiveStop();
                btn_LiveImage.Text = "Start Live";
            }

            //Setup Camera
            VCDProp = VCDSimpleModule.GetSimplePropertyContainer(icImagingControl1.VCDPropertyItems);
            //White balance
            VCDProp.Automation[VCDIDs.VCDID_WhiteBalance] = false;
            VCDProp.RangeValue[VCDIDs.VCDElement_WhiteBalanceRed] = 120;
            VCDProp.RangeValue[VCDIDs.VCDElement_WhiteBalanceBlue] = 65;
            //VCDProp.RangeValue[VCDIDs.VCDElement_WhiteBalanceGreen] = 65;
            VCDProp.Automation[VCDIDs.VCDID_Exposure] = false;
            VCDProp.RangeValue[VCDIDs.VCDID_Exposure] = 1 / 130;
            VCDProp.Automation[VCDIDs.VCDID_Gain] = false;
            VCDProp.RangeValue[VCDIDs.VCDID_Gain] = 439;

            icImagingControl1.ShowPropertyDialog();
        }

        private void btn_lastUsedProperties_Click(object sender, EventArgs e)
        {
            // Stop CameraStream
            if (icImagingControl1.LiveVideoRunning)
            {
                icImagingControl1.LiveStop();
                btn_LiveImage.Text = "Start Live";

            }

            //// Update button states
            //cmdLive.Enabled = icImagingControl1.DeviceValid;
            //cmdProperties.Enabled = icImagingControl1.DeviceValid;

            // Try to load the previously used device.
            try
            {
                icImagingControl1.LoadDeviceStateFromFile("device.xml", true);
            }
            catch { }

            icImagingControl1.ShowPropertyDialog();
        }

        private void btn_saveProperties_Click(object sender, EventArgs e)
        {
            if (icImagingControl1.DeviceValid)
            {
                SaveFileDialog saveproperties = new SaveFileDialog();
                saveproperties.InitialDirectory = @"C:\Users\tuandanh\Desktop\Connect Camera\Connect Camera\bin\Debug";
                saveproperties.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*";
                saveproperties.FilterIndex = 1;
                saveproperties.RestoreDirectory = true;

                if (saveproperties.ShowDialog() == DialogResult.OK)    // nếu người dùng nhấn ok
                {
                    icImagingControl1.SaveDeviceStateToFile(saveproperties.FileName);
                }

            }
        }

        private void btn_loadProperties_Click(object sender, EventArgs e)
        {
            // Stop CameraStream
            if (icImagingControl1.LiveVideoRunning)
            {
                icImagingControl1.LiveStop();
                btn_LiveImage.Text = "Start Live";

            }
            string device_path = "";

            OpenFileDialog openfilexml = new OpenFileDialog();
            openfilexml.InitialDirectory = @"C:\Users\tuandanh\Desktop\Connect Camera\Connect Camera\bin\Debug";
            openfilexml.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*";
            openfilexml.RestoreDirectory = true;
            openfilexml.Multiselect = false;

            if (openfilexml.ShowDialog() == DialogResult.OK)
            {
                device_path = openfilexml.FileName;
                icImagingControl1.LoadDeviceStateFromFile(openfilexml.FileName, true);

                icImagingControl1.ShowPropertyDialog();
            }

        }

        //private void BKBIS_Leave(object sender, EventArgs e)
        //{
        //    if (icImagingControl1.DeviceValid)
        //    {
        //        icImagingControl1.SaveDeviceStateToFile("device.xml");
        //    }
        //}

        //private void BlisterInspection_Leave(object sender, EventArgs e)
        //{
        //    if (icImagingControl1.DeviceValid)
        //    {
        //        icImagingControl1.SaveDeviceStateToFile("device.xml");
        //    }
        //}

        private void BKBIS_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (icImagingControl1.DeviceValid)
            {
                icImagingControl1.SaveDeviceStateToFile("device.xml");
            }
        }



    }
}
